a
    Rir                     @   s   d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
 ddlZddlZdddgd dZG dd	 d	Zeed
ddZddddZedkre  dS )u,  
st7735.py - Драйвер для дисплея ST7735 (128x160)
- SPI интерфейс
- Пины по умолчанию: DC=24, RST=25, CS=8
- Режим: портрет (128x160)
- Цвет: RGB565
- Шрифт: 8x14 (внешний модуль font_8x14)
- Поддержка: заливки, текста, поворота, сетки (строка/столбец)
- Режимы: класс для импорта, CLI-приложение


	Назначение: 
		Низкоуровневый драйвер для управления дисплеем ST7735 (128x160) через SPI-интерфейс.
		Поддерживает инициализацию дисплея, заливку областей, вывод текста с настраиваемыми 
		параметрами (цвет, фон, шрифт, поворот, интервалы).
	Возможности:
		1. Использование как класса, используемого приложением
		2. Использование как самостоятельного приложения
	Синтаксис:
		st7735.py 
			[--uid <идентификатор>] 
			[--dc nn]
			[--res nn]
			[--cs nn]
			[--port {0|1}]
			[--device {0|1}]
			[--speed nn]
			[--xy nn nn] 
			[--rc nn nn] 
			[-t text <текст, разделенный символом 
>] 
			[--color #RRGGBB] 
			[--bg_color #RRGGBB] 
			[--rotation {0|90|180|270}] 
			[--line_spacing nn] 
			[--char_spacing nn]
			[-f font font_name] 
			[--stop]
			[-o output {text|json}]	

		где:
			Идентификация:
			--uid       	- 	Уникальный идентификатор. 
								Параметр не обязательный. 
								В коде никак не обрабатывается.
								Предназначен скорее для источника, запросившего данные с датчика, может быть использован 
								при синхронном запросе в источнике и последующей обработке результата в источнике.
			Аппаратные настройки:
			--dc			-   Номер пина Data/Command. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - по умолчанию номер пина = ST7735.DC 
									- nn - номер пина 
			--res			-   Номер пина Reset. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - по умолчанию номер пина = ST7735.RES 
									- nn - номер пина 
			--cs			-   Номер пина Chip Select. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - по умолчанию номер пина = ST7735.CS 
									- nn - номер пина 
			--port			-   Номер SPI - порта. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - по умолчанию номер порта = ST7735.PORT 
									- 0|1 - номер порта. 
			--device		-   Номер устройства SPI. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - по умолчанию номер устройства = ST7735.DEVICE 
									- 0|1 - номер устройства. 
			--speed			-   Скорость SPI в Гц. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - по умолчанию скорость ST7735.SPEED, Гц 
									- nn - скорость spi, Гц. 
			Позиционирование:
			--xy nn nn		- 	Координаты вывода текста, px. 
								Параметр не обязательный.
								Допускается следующий формат:
									- координаты не указаны - вывод текста НЕ будет произведен;
									- nn nn - вывод текста будет произведен по указанным координатам X и Y
								Следует обратить внимание, что координаты, следующие за параметром, должны 
								быть указаны через пробел. Координат должно быть две - X пробел Y
			--rc nn nn		- 	Координаты вывода текста, в формате строка столбец. 
								Параметр не обязательный.
								Допускается следующий формат:
									- координаты не указаны - вывод текста НЕ будет произведен;
									- nn nn - вывод текста будет произведен по указанным координатам строка и столбец
								Следует обратить внимание, что координаты, следующие за параметром, должны 
								быть указаны через пробел. Координат должно быть две - строка пробел столбец
			Содержимое:
			-t text 		- 	Текст. 
								Параметр не обязательный.
								Допускается следующий формат:
									- текст не указан - будет произведена очистка всего экрана
									- текст или блок текста - вывод текста будет произведен по указанным координатам (параметр --xy или --rc)
								Если текст представляет собой строку с разделением символом перевода каретки (
), 
								то текст будет выведен на экран построчно.
			Оформление:
			--color 		- 	Цвет текста. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - цвет текста будет выведен цветом палитры по умолчанию - PALETTE['TEXT'];
									- {'BACKGROUND'|'TEXT'|'SUCCESS'|'WARNING'|'CRITICAL'} - предустановленный цвет из палитры PALETTE[];
									- #RRGGBB - цвет текста будет выведен указанным цветом в hex - формате
			--bg_color 		- 	Цвет фона. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - цвет фона использоваться не будет;
									- {'BACKGROUND'|'TEXT'|'SUCCESS'|'WARNING'|'CRITICAL'} - предустановленный цвет из палитры PALETTE[];
									- #RRGGBB - цвет фона будет выведен указанным цветом в hex - формате
			--rotation 		- 	Поворот выводимой текстовой строки или блока строк. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - поворот равен нулю;
									- {0|90|180|270} - поворот на указанный угол в градусах
								Важно учесть что попытка задать произвольный угол приведет к тому, что 
								величина поворота будет принята равно нулю.	
			--line_spacing	- 	Величина межстрочного интервала в px. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - межстрочный интервал равен 0px;
									- nn - межстрочный интервал в px.
			--char_spacing	- 	Величина интервала между символами в px. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - интервал между символами равен 0px;
									- nn - межсимвольный интервал в px.
			-f font 		- 	Имя шрифта из библиотеки ./fonts 
								Параметр не обязательный.
								Допускается следующий формат:
									- имя шрифта не указано - будет использован шрифт по умолчанию FONTS['default']									
									- имя шрифта указано - будет использован шрифт с именем FONTS[<имя_шрифта>]
								Если имя шрифта не найдено в библиотеке ./fonts, будет применен шрифт FONTS['default']
			Управление:
			--stop			- 	Параметр указывающий на необходимость остановки после вывода на дисплей данных.
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - остановка не предусмотрена;
									- параметр указан в виде --stop - остановка скрипта после вывода данных на экран.
			-o output		- 	Тип результата. 
								Параметр не обязательный.
								Допускается	следующий формат:
									- параметр не указан - тихий режим, без вывода результата
									- text - тип text
									- json - тип json

Примеры:
	# Очистка экрана чёрным цветом
	st7735.py --color '#000000'

	# Вывод текста по координатам (пиксели)
	st7735.py --xy 5 10 --text "Temp: 24.5C" --color '#00FF00'

	# Многострочный текст по строкам/столбцам с фоном
	st7735.py --rc 0 0 --text "Line1
Line2" --color 'TEXT' --bg_color 'BACKGROUND'

	# Повёрнутый текст с кастомным шрифтом
	st7735.py text --xy 50 80 --text "90°" --color '#FFFF00' --rotation 90 -f font_8x14

	# Использование как класса в Python-скрипте
		>>> from devices.st7735 import ST7735
		>>> import spidev
		>>> import RPi.GPIO as GPIO
		>>> spi = spidev.SpiDev()
		>>> spi.open(0, 0)
		>>> spi.max_speed_hz = 12_000_000
		>>> display = ST7735(spi_port=0, spi_device=0)
		>>> display.clear()
		>>> display.draw_text(10, 20, "Hello", color='#FFFFFF')
		>>> display.cleanup()
    N)OptionalDictAnyUnion      p   )WIDTHHEIGHT c                   @   sp  e Zd ZdZdZdZdZdZdZdZ	ddd	d
ddZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Zd!ZdZ eeed"d"fe!e!e!e"e# e$e%d"f d"d#d$d%Z&dPe"e# d"d&d'd(Z'e!d"d)d*d+Z(d"d,d-d.Z)d"d,d/d0Z*d"d,d1d2Z+e$e%d"f e$e!d"f d3d4d5Z,dQe!e!e!e!e$e!d"f d"d6d7d8Z-dRe$e%d"f d"d3d9d:Z.e%e/e%e#f e0d;d<d=Z1e$e%d"f e/e%e#f d>d?d@Z2dSe!e!e%e$e%d"f e$e%d"f e!e!e$e%d"f d"dA	dBdCZ3dTe!e!e%e$e%d"f e$e%d"f e!e!e!e$e%d"f d"dD
dEdFZ4dUe!e!e%e$e%d"f e$e%d"f e!e!e!e$e%d"f d"dG
dHdIZ5d"d,dJdKZ6dLdM Z7dNdO Z8d"S )VST7735z0.2      r   r   i  z#000000z#FFFFFFz#00FF00z#FFFF00z#FF0000)
BACKGROUNDTEXTSUCCESSWARNINGCRITICAL                                     6   :   )   *   +   ,            N)dc_pinres_pincs_pinspibg_colorreturnc                 C   st  || _ || _|| _|| _td ttj t| j | j| jgtj	 i | _
ztjtjt}tj|d}tj|r(tj|}d}	|tjvrtjd| d}	z>zRddlm}
 t|
tr|
 D ],\}}t|trd|v rd|v r|| j
|< qW n ty } zzt|tjvr2tjd| ddlm}
 t|
tr|
 D ]4\}}t|trRd|v rRd|v rR|| j
|< qRW n ty   Y n0 W Y d }~n
d }~0 0 W |	r|tjv rtj| |tjv r(tj| n8|	r|tjv rtj| |tjv r&tj| 0 W n ty>   Y n0 | j
sRt| j
d< |d ur`|nd	}| || _d S )
NFfontsr   T)FONTSr	   r
   defaultr   ) r)   r*   r+   r,   GPIOZsetwarningsZsetmodeZBCMZsetupZOUT_fontsospathdirnameabspath__file__joinisdirsysinsertZdevices.st7735.fontsr0   
isinstancedictitemsImportErrorr/   	ExceptionremoveDEFAULT_FONT_resolve_colorr-   )selfr)   r*   r+   r,   r-   Z_module_dirZ_fonts_packageZ_parent_dirZ_path_addedZFONT_REGISTRYnameZfont_obje rH   -/var/aqua_controller/devices/st7735/st7735.py__init__   s`    

 
zST7735.__init__)r,   r.   c                 C   s   | j d urtd|| _ d S )NuG   SPI уже установлен. Нельзя перезаписать.)r,   RuntimeError)rE   r,   rH   rH   rI   set_spiD  s    
zST7735.set_spi)cmdr.   c                 C   sT   | j d u rtdt| jtj t| jtj | j |g t| jtj d S )Nl   SPI не инициализирован. Вызовите set_spi() перед использованием.)	r,   rK   r2   outputr+   LOWr)   
writebytesHIGH)rE   rM   rH   rH   rI   _commandJ  s    
zST7735._commandr.   c                 C   s   | j d u rtdt| jtj t| jtj t|t	rB|g}d}t
dt||D ]}| j ||||   qVt| jtj d S )NrN   i   r   )r,   rK   r2   rO   r+   rP   r)   rR   r=   intrangelenrQ   )rE   buf
chunk_sizeirH   rH   rI   _dataS  s    

zST7735._datac                 C   sd   | j d u rtdt| jtj td t| jtj td t| jtj td d S )NrN   g{Gz?333333?皙?)	r,   rK   r2   rO   r*   rR   timesleeprP   rE   rH   rH   rI   reset`  s    


zST7735.resetc                 C   sH  | j d u rtd|   td | | j td | | j td | | j | 	d | | j
 | 	d | | j | | j td | jd? d@ }| jd@ }||g}d	}d
}| | j | 	g d | | j | 	g d | | j t|| D ]}| 	||  q|| }|rD| 	||  d S )NrN   r]   r\   r      g?r      iS     )r   r   r      )r   r   r      )r,   rK   ra   r^   r_   rS   SWRESETSLPOUTMADCTLr[   COLMODINVOFFDISPONr-   CASETRASETRAMWRrV   )rE   hilopixeltotalchunk_	remainderrH   rH   rI   cleark  s<    







zST7735.clear)colorr.   c              
   C   sF  |d u rd S z
t |ts,tdt| |  }|sBW d S || jv rV| j| }|dd}t|dkr~t	d| dz:t
|dd d	}t
|dd
 d	}t
|d
d d	}W n" t	y   t	d| dY n0 |d? d@ }|d? d@ }|d? d@ }|d> |d> B |B }	|	W S  ty@ }
 zW Y d }
~
d S d }
~
0 0 d S )Nu?   Цвет должен быть строкой, получен: #    u=   Некорректная длина строки цвета: u(   . Ожидается 6 символов.r   r(         u2   Некорректный формат цвета: uI   . Ожидается шестнадцатеричное значение.      ?      rb   )r=   str	TypeErrortypeupperstripPALETTEreplacerW   
ValueErrorrU   rA   )rE   rx   Zcolor_upperrgbZr_565Zg_565Zb_565Zrgb565rG   rH   rH   rI   rD     s4    


zST7735._resolve_color)x0y0x1y1color565r.   c                 C   s  | j d u rtd|d u rd S || j }|| j }|| j }|| j }	|dksf|dksf|dk sf|	dk rjd S td|}td|}td|}td|	}	| | j | |d? d@ |d@ |d? d@ |d@ g | | j	 | |d? d@ |d@ |	d? d@ |	d@ g | | j
 |d? d@ }
|d@ }|
|g}|| d	 |	| d	  }d
}t|| D ]}| ||  qN|| }|r| ||  d S )NrN         r   re   rf   r   rc   r   rd   )r,   rK   H_OFFSETV_OFFSETmaxminrS   rm   r[   rn   ro   rV   )rE   r   r   r   r   r   Zx_startZx_endZy_startZy_endrp   rq   rr   Ztotal_pixelsrt   ru   rv   rH   rH   rI   	fill_area  sB    




 



zST7735.fill_areac                 C   sF   | j d u rtd| |}|d urB| dd| jd | jd | d S )NrN   r   r   )r,   rK   rD   r   r	   r
   )rE   rx   r   rH   rH   rI   fill_screen  s
    

zST7735.fill_screen)charfontr.   c                 C   sz   | dd}| dd}|| }| |}t|ttfrHt||krH|S | d}t|ttfrpt||krp|S dg| S )Nr	   r   r
   r   r   r   )getr=   listtuplerW   )rE   r   r   widthheightexpected_lenpatternspacerH   rH   rI   _get_char_pattern  s    

zST7735._get_char_pattern)	font_namer.   c                 C   s4   |r|| j v r| j | S d| j v r,| j d S tS d S )Nr1   )r3   rC   )rE   r   rH   rH   rI   _select_font  s
    


zST7735._select_font)	xytextrx   r-   rotationchar_spacingr   r.   c	              
   C   s  | j d u rtd|r t|ts$d S | |}	| |}
| |}|d }|d }|}|D ]L}|dv r~|| | jkr qn|| | jkr q| ||}|
d ur|dkr| 	|||| d || d |
 n|dkr|| jd || d   }}| 	|||| d || d |
 n|dkrz| jd || d  | jd || d   }}| 	|||| d || d |
 nH|d	kr| jd || d  | }}| 	|||| d || d |
 |	d urt
|D ]}t
|D ]}||| |  r|dkr*| 	|| || || || |	 q|dkr|| | jd ||   }}d|  krj| jk rn n0d|  kr| jk rn n| 	|||||	 n|dkr | jd ||  | jd ||   }}d|  kr| jk rn n0d|  kr| jk rn n| 	|||||	 nt|d	kr| jd ||  ||  }}d|  kr`| jk rn n0d|  kr~| jk rn n| 	|||||	 qq||| 7 }qZd S )
NrN   r	   r
   r      r   r   Z   r     )r,   rK   r=   r   rD   r   r	   r
   r   r   rV   )rE   r   r   r   rx   r-   r   r   r   r   Zbg_color565	used_font
font_widthfont_heightposr   r   ZpxpydydxrH   rH   rI   	draw_text)  s`    





$
$
.$
"

&
<
&<
<zST7735.draw_text)
r   r   r   rx   r-   r   line_spacingr   r   r.   c
                 C   s   | j d u rtd|r t|ts$d S | |	}
|
d }|
d }|d}|}|D ]X}|dv rp|| | jkr qn|| | jkr q| j||||||||	d ||| 7 }qPd S )NrN   r
   r	   
r   )r   r   r   rx   r-   r   r   r   )r,   rK   r=   r   r   splitr
   r   )rE   r   r   r   rx   r-   r   r   r   r   r   r   r   linesZ	current_ylinerH   rH   rI   draw_multiline_text}  s4    


zST7735.draw_multiline_text)
rowcolr   rx   r-   r   r   r   r   r.   c
                 C   sv   | j d u rtd|r t|ts$d S | |	}
|
d }|
d }|||  }|||  }| j|||||||||	d	 d S )NrN   r	   r
   	r   r   r   rx   r-   r   r   r   r   )r,   rK   r=   r   r   r   )rE   r   r   r   rx   r-   r   r   r   r   r   r   r   r   r   rH   rH   rI   draw_position_text  s(    

zST7735.draw_position_textc                 C   s   t   d S N)r2   cleanupr`   rH   rH   rI   r     s    zST7735.cleanupc                 C   s   |    | S r   )rw   r`   rH   rH   rI   	__enter__  s    zST7735.__enter__c                 C   s   |    d S r   )r   )rE   exc_type	exc_value	tracebackrH   rH   rI   __exit__  s    zST7735.__exit__)N)N)N)NNr   r   N)NNr   r   r   N)NNr   r   r   N)9__name__
__module____qualname__VERSIONDCRESCSPORTDEVICESPEEDr   rg   rh   ZFRMCTR1ZFRMCTR2ZFRMCTR3ZPWCTR1ZPWCTR2ZPWCTR3ZPWCTR4ZPWCTR5ZVMCTR1rk   ri   rj   rl   rm   rn   ro   r	   r
   r   r   rU   r   r   r   r   rJ   rL   rS   r[   ra   rw   rD   r   r   r   r   r   r   r   r   r   r   r   r   rH   rH   rH   rI   r      s   	
M	' 9 
. 
      


Y      


@      


'r   )valuer.   c                 C   s6   zt | dW S  ty0   td|  dY n0 d S )Nr   u#   Неверное значение: u:   . Ожидается целое число (10 или 16).)rU   r   argparseZArgumentTypeError)r   rH   rH   rI   __fn_to_int  s    r   rT   c                  C   s$  d} d}zt jdd}|jdtdd dd |jd	tdtjd
d |jdtdtjdd |jdtdtjdd |jdtdddgtj	dd |jdtdddgtj
dd |jdtdtjdd |jdtddd dd |jdtddd dd |jddtdd d d |jd!tdd d"d |jd#tdd d$d |jd%tdg d&d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/d0d1d2 |jd3d4tdd5d6gd d7d | }W n: t jy } zd8} d9| }d }W Y d }~n
d }~0 0 | dkrx|rxz2dd l}| }||j|j |j|_d|_W nD tyv } z*d:} d;|j d<|j d=| }W Y d }~n
d }~0 0 | dkrJ|rJzzt|j|j|j|jd>}|| |jd u s|j s|  |jd ur|j r|jd ur,|j\}}	|j ||	|j|j!|j|j"|j#|j$|j%d?	 nl|j&d urn|j&\}
}|j'|
||j|j!|j|j"|j#|j$|j%d@	 n*|j dd|j|j!|j|j"|j#|j$|j%d?	 |j(rt)dA W n@ ty } z&dB} dCt*|j+ dD| }W Y d }~n
d }~0 0 W |d urJz|,  W n ty   Y n0 n.|d urHz|,  W n tyF   Y n0 0 z||r|j-d ur|j-. d5krȝ }|dEt|  dFt| dG7 }||j/d urdHt|j/ dGndI7 }dI}||jd urdJt|j dKndI7 }||jd urdLt|j dKndI7 }||jd ur(dMt|j dKndI7 }||jd urNdNt|j dKndI7 }||jd urtdOt|j dKndI7 }||jd urdPt|j dKndI7 }|| r| dQndI7 }||jd ur|j&d u rdRt|jd  dSt|jd  dGndI7 }||j&d urB|jd u rBdTt|j&d  dUt|j&d  dGndI7 }||j rt|jd urtdVt|j dGndI7 }dI}||j!d urdWt|j! dKndI7 }||jd urdXt|j dKndI7 }||j"d urdYt|j" dKndI7 }||j#d urdZt|j# dKndI7 }||j$d ur6d[t|j$ dKndI7 }||j%d ur\d\t|j% dKndI7 }|| rx| dQndI7 }||j(rd]nd^7 }||j-d urd_t|j- dKndI7 }|dQ7 }t0| |
r|j-d u
r|j-. d6k
ri }| |d`< t||da< i |db< |j/d ur(t|j/|db dc< i |db dd< |jd urR|j|db dd de< |jd urp|j|db dd df< |jd ur|j|db dd dg< |jd ur|j|db dd dh< |jd ur|j|db dd di< |jd ur|j|db dd dj< i |db dk< |jd u	r8|j&d u 	r8|jd |db dk dl< |jd |db dk dm< |j&d u	r||jd u 	r||j&d |db dk dn< |j&d |db dk do< |j 	r|jd u	rt|j|db d5< i |db dp< |j!d u	rt|j!|db dp dq< |jd u	rt|j|db dp dr< |j"d u
r|j"|db dp ds< |j#d u
r2|j#|db dp dt< |j$d u
rP|j$|db dp du< |j%d u
rrt|j%|db dp dv< |j(d u
rdw|db dx< nd|db dx< |j-d u
r|j-|db dy< t0t1j2|dddz W nV ty } z<d{} d|t*|j+ dD| }t0dE|  dF| d} W Y d }~n
d }~0 0 d S )~N   oku,   Управление дисплеем ST7735)descriptionz--uidFu>   Уникальный идентификатор запроса)r   requiredr1   helpz--dcu    Номер пина Data/Commandz--resu   Номер пина Resetz--csu   Номер пина Chip Selectz--portr   r   u   Номер SPI - порта)r   r   choicesr1   r   z--deviceu#   Номер устройства SPIz--speedu   Скорость SPI в Гцz--xyr(   u2   Координаты вывода текста, px)r   r   nargsr1   r   z--rcu]   Координаты вывода текста, в формате строка столбецz-tz--textu
   Текстz--coloru   Цвет текстаz
--bg_coloru   Цвет фонаz
--rotation)r   r   r   r   u^   Поворот выводимой текстовой строки или блока строкz--line_spacinguB   Величина межстрочного интервала в pxz--char_spacinguG   Величина интервала между символами в pxz-fz--fontu.   Имя используемого шрифтаz--stop
store_trueud   Необходимость остановки скрипта после вывода на экран)actionr   z-oz--outputr   jsonu+   Формат вывода: text или jsoni  uA   ошибка обработки командной строки: i  zSPI :u    недоступен: )r)   r*   r+   r-   r   )	r   r   r   rx   r-   r   r   r   r   u6   Нажмите Enter, чтобы завершить...i  u>   Ошибка инициализации устройства: z => zstatus<z> - <z>
zuid<rz   zdc<z> zres<zcs<zport<zdevice<zspeed<r   zx<z>, y<zr<z>, c<ztext<zcolor<z	bg_color<z	rotation<zline_spacing<zchar_spacing<zfont<zstop<1> zstop<0> zoutput<statusmessagerequestuidZdevice_configdcrescsportdevicespeedpositionr   r   r   cZ
decorationrx   r-   r   r   r   r   TstoprO   )Zensure_asciiindenti  u4   Ошибка формирования ответа: >)3r   ArgumentParseradd_argumentr   r   r   r   r   r   r   r   r   
parse_argsArgumentErrorspidevSpiDevopenr   r   r   max_speed_hzmoderA   r   r   r   r-   rL   r   r   rw   xyr   rx   r   r   r   r   rcr   r   inputr   r   closerO   lowerr   printr   dumps)_statusZ_status_messageparserargsrG   r   Zmy_spiZ	my_ST7735Zmy_xZmy_yZmy_rowZmy_colZ	_responseZ_tmp_responserH   rH   rI   main  sj   

0


.

"&&&&&&&FF2&&&&&&&"r  __main__)__doc__ZRPi.GPIOr2   r^   r   r   typingr   r   r   r   r4   r;   rC   r   r   rU   r   r  r   rH   rH   rH   rI   <module>   s,    0    - i