grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a BjŒjŽ?ã@shddlmZmZddlmZddlZGdd„deƒZGdd„deƒZGd d „d eƒZ Gd d „d eƒZ dS) é)ÚdivisionÚprint_functioné)Ú BaseScreenNc@sHeZdZddd„Zddd„Zdd„Zd d „Zd d „Zd d„Zdd„Z dS)Ú LCDScreenNcCsdS©N©)ÚselfÚcolorsZbright_is_boldÚ has_underlinerrú7/usr/lib64/python3.9/site-packages/urwid/lcd_display.pyÚset_terminal_propertiessz!LCDScreen.set_terminal_propertiesTcCsdSrr)r Úenablerrr Úset_mouse_tracking!szLCDScreen.set_mouse_trackingcGsdSrr©r Úargsrrr Úset_input_timeouts$szLCDScreen.set_input_timeoutscGsdSrrrrrr Úreset_default_terminal_palette'sz(LCDScreen.reset_default_terminal_palettecCsdSrr)r ÚsizeÚrrrr Ú draw_screen*szLCDScreen.draw_screencCsdSrr©r rrr Úclear-szLCDScreen.clearcCs|jSr)Ú DISPLAY_SIZErrrr Ú get_cols_rows0szLCDScreen.get_cols_rows)NNN)T) Ú__name__Ú __module__Ú __qualname__r rrrrrrrrrr rsÿ  rcsÀeZdZdZgd¢ZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZ‡fdd„Zedd„ƒZdd„Zdd„ZGdd„deƒZGdd„deƒZ ed d!„ƒZ!‡Z"S)"Ú CFLCDScreenz7 Common methods for Crystal Fontz LCD displays )NZup_pressZ down_pressZ left_pressZ right_pressZ enter_pressZ exit_pressZ up_releaseZ down_releaseZ left_releaseZ right_releaseZ enter_releaseZ exit_releaseZul_pressZur_pressZll_pressZlr_pressZ ul_releaseZ ur_releaseZ ll_releaseZ lr_releaserréé é é é ééé"é€é@ééééFcs:tt|ƒ ¡||_ddlm}|||dd�|_d|_dS)zM device_path -- eg. '/dev/ttyUSB0' baud -- baud rate r)ÚSerial)ÚtimeoutÚN)ÚsuperrÚ__init__Ú device_pathÚserialr-Ú_deviceÚ _unprocessed)r r2Úbaudr-©Ú __class__rr r1Zs  zCFLCDScreen.__init__cCs€d}|D]B}tdƒD]4}|dL}t|ƒd|>@r8|dO}|d@r|dN}qqtdƒD]}|dL}|d@rT|dN}qT|d?d@S) Ni!óéri€r'i„éiÿÿ)ÚrangeÚord)ÚclsÚbufZnewCRCZbyteZ bit_countrrr Úget_crcfs    zCFLCDScreen.get_crccCsNt|ƒtt|ƒƒ|}| |¡}|t|d@ƒt|d?ƒ}|j |¡dS)z� low-level packet sending. Following the protocol requires waiting for ack packet between sending each packet to the device. éÿr9N)ÚchrÚlenr?r4Úwrite)r ÚcommandÚdatar>Úcrcrrr Ú _send_packetŠs zCFLCDScreen._send_packetcCst|j|j ¡|_z"| |j¡\}}}||_||fWS|jyJYdS|jyl|jdd…|_Yq0qdS)z¼ low-level packet reading. returns (command/report code, data) or None This method stored data read and tries to resync when bad data is received. Nr)r5r4ÚreadÚ _parse_dataÚMoreDataRequiredÚ InvalidPacket)r rDrEZ unprocessedrrr Ú _read_packet•s  zCFLCDScreen._read_packetc@s eZdZdS)zCFLCDScreen.InvalidPacketN©rrrrrrr rKªsrKc@s eZdZdS)zCFLCDScreen.MoreDataRequiredNrMrrrr rJ¬srJcCsÂt|ƒdkr|j‚t|dƒ}t|dƒ}||jkr>| d¡‚t|ƒ|dkrT|j‚| |dd|…¡}t|d|ƒt|d|ƒd>}||kr | d ¡‚||dd|…|d|d…fS) z¸ Try to read a packet from the start of data, returning (command/report code, packet_data, remaining_data) or raising InvalidPacket or MoreDataRequired r)rrzlength value too larger+Nr*r9zCRC doesn't match)rBrJr<ÚMAX_PACKET_DATA_LENGTHrKr?)r=rErDÚplenrFZpcrcrrr rI¯s     $ zCFLCDScreen._parse_data)#rrrÚ__doc__ZKEYSZCMD_PINGZ CMD_VERSIONZ CMD_CLEARÚ CMD_CGRAMÚCMD_CURSOR_POSITIONÚCMD_CURSOR_STYLEÚCMD_LCD_CONTRASTÚ CMD_BACKLIGHTÚ CMD_LCD_DATAÚCMD_GPOÚCMD_KEY_ACTIVITYZCMD_ACKÚ CURSOR_NONEZCURSOR_BLINKING_BLOCKZCURSOR_UNDERSCOREZ CURSOR_BLINKING_BLOCK_UNDERSCOREÚCURSOR_INVERTING_BLINKING_BLOCKrNr r r1Ú classmethodr?rGrLÚ ExceptionrKrJrIÚ __classcell__rrr7r r5s>  # rc@s8eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd S) ÚKeyRepeatSimulatorz® Provide simulated repeat key events when given press and release events. If two or more keys are pressed disable repeating until all keys are released. cCs||_||_i|_d|_dS)z† repeat_delay -- seconds to wait before starting to repeat keys repeat_next -- time between each repeated key FN)Ú repeat_delayÚ repeat_nextÚpressedÚmultiple_pressed)r r_r`rrr r1ÎszKeyRepeatSimulator.__init__cCs|jr d|_t ¡|j|<dS)NT)rarbÚtime©r Úkeyrrr ÚpressØszKeyRepeatSimulator.presscCs&||jvrdS|j|=|js"d|_dS)NF)rarbrdrrr ÚreleaseÝs  zKeyRepeatSimulator.releasecCsLt|jƒdks|jrdS|jD](}td|j||jt ¡ƒ|fSdS)z· Return (remaining, key) where remaining is the number of seconds (float) until the key repeat event should be sent, or None if no events are pending. rNr)rBrarbÚmaxr_rcrdrrr Ú next_eventäs ÿÿzKeyRepeatSimulator.next_eventcCs@t|jƒdkrdS|jD]"}t ¡|j|j|j|<dSdS)z~ Cakk this method when you have sent a key repeat event so the timer will be reset for the next event rN)rBrarcr_r`rdrrr Ú sent_eventðs  ÿzKeyRepeatSimulator.sent_eventN) rrrrPr1rfrgrirjrrrr r^Æs   r^csŒeZdZdZdZdZejZdddgd¢f‡fdd „ Z d d „Z d d „Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Z‡ZS)Ú CF635Screena Crystal Fontz 635 display 20x4 character display + cursor no foreground/background colors or settings supported see CGROM for list of close unicode matches to characters available 6 button input up, down, left, right, enter (check mark), exit (cross) )ér+uå①②③④⑤⑥⑦⑧①②③④⑤⑥⑦⑧►◄⇑⇓«»↖↗↙↘▲▼↲^ˇ█ !"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüàâ�°Â¹Â²Â³â�´â�µâ�¶â�·â�¸â�¹Â½Â¼Â±â‰¥â‰¤Î¼â™ªâ™«â‘´â™¥â™¦â‘µâŒœâŒŸâ€œâ€�()αɛδ∞@£$¥èéùìòÇᴾØøʳÅå⌂¢ΦτλΩπΨΣθΞ♈ÆæßÉΓΛΠϒ_ÈÊêçğŞşİι~◊▇▆▄▃â–�ƒ▉▋▌â–�â–�⑶◽▪↑→↓â†�Ã�Ã�ÓÚÃ�áíóúýÔôŮůČĔŘŠŽÄ�ĕřšž[\]{|}iÂgà?gÀ?)ZupZdownÚleftÚrightZenterZesccsXtt|ƒ ||¡||_||_t||ƒ|_||_d|_d|_ g|_ d|_ d|_ d|_ dS)a device_path -- eg. '/dev/ttyUSB0' baud -- baud rate repeat_delay -- seconds to wait before starting to repeat keys repeat_next -- time between each repeated key key_map -- the keys to send for this device's buttons NrF)r0rkr1r_r`r^Ú key_repeatÚkey_mapÚ _last_commandÚ_last_command_timeÚ_command_queueÚ _screen_bufÚ_previous_canvasÚ_update_cursor)r r2r6r_r`rpr7rr r1's  zCF635Screen.__init__cCs |jjgS)zf return the fd from our serial device so we get called on input and responses )r4Úfdrrrr Úget_input_descriptors@sz!CF635Screen.get_input_descriptorsc Csg}g}d}| ¡}|sqÎ|\}}||jkrª|rªt|dƒ}d|krPdkrÌnqÌ|dk}||dd} |j| } |rˆ|j | ¡n| | ¡|j | ¡| |¡q |d@dkr |d@|jkr |  ¡q |j  ¡} | �r| \}} |�s| | ¡|j  ¡d}||gfS) aì Return a (next_input_timeout, keys_pressed, raw_keycodes) tuple. The protocol for our device requires waiting for acks between each command, so this method responds to those as well as key press and release events. Key repeat events are simulated here as the device doesn't send any for us. raw_keycodes are the bytes of messages we received, which might not seem to have any correspondence to keys_pressed. Nrrr"réÀr(é?) rLrXr<rprorgÚappendrfrqÚ_send_next_commandrirj) r ÚinputZ raw_inputr.ZpacketrDrEZd0rgZkeycodereZ next_repeatrrr Úget_input_nonblockingGs:          z!CF635Screen.get_input_nonblockingcCs@|jsd|_dS|j d¡\}}| ||¡||_t ¡|_dS)z8 send out the next command in the queue Nr)rsrqÚpoprGrcrr©r rDrErrr r||s zCF635Screen._send_next_commandcCs&|j ||f¡|jdur"| ¡dSr)rsr{rqr|r€rrr Ú queue_commandˆs zCF635Screen.queue_commandc Cs*||jksJ‚|jr|j}ng}g}d}| ¡D]h}g}|D]\}} } | | ¡q<|rb|||kr†| |jtdƒt|ƒd |¡¡| |¡|d7}q0|jr¼|jj |j kr¼|j rº|j s¼nX|j durÜ| |j t|j ƒ¡n8|j \} }| |j t| ƒt|ƒ¡| |j t|jƒ¡d|_ ||_||_dS)Nrr/rF)rrtZcontentr{r�rVrAÚjoinruZcursorrvrSrYrRÚ cursor_style) r rZcanvasZosbZsbÚyÚrowÚtextÚaÚcsÚrunÚxrrr rŽs@  ÿ   ÿþþ  zCF635Screen.draw_screencCsTd|krdksnJ‚t|ƒdks*J‚| |jt|ƒd dd„|Dƒ¡¡dS)a3 Program character data. Characters available as chr(0) through chr(7), and repeated as chr(8) through chr(15). index -- 0 to 7 index of character to program data -- list of 8, 6-bit integer values top to bottom with MSB on the left side of the character. rér9r/cSsg|] }t|ƒ‘qSr)rA)Ú.0rŠrrr Ú ¾óz-CF635Screen.program_cgram..N)rBr�rQrAr‚)r ÚindexrErrr Ú program_cgram±s ÿzCF635Screen.program_cgramcCs*d|krdksnJ‚||_d|_dS)z  style -- CURSOR_BLINKING_BLOCK, CURSOR_UNDERSCORE, CURSOR_BLINKING_BLOCK_UNDERSCORE or CURSOR_INVERTING_BLINKING_BLOCK rr+TN)rƒrv)r Zstylerrr Úset_cursor_styleÀszCF635Screen.set_cursor_stylecCs0d|krdksnJ‚| |jt|ƒ¡dS)zE Set backlight brightness value -- 0 to 100 rédN)r�rUrA©r Úvaluerrr Ú set_backlightÊszCF635Screen.set_backlightcCs0d|krdksnJ‚| |jt|ƒ¡dS)z# value -- 0 to 255 rr@N)r�rTrAr“rrr Úset_lcd_contrastÓszCF635Screen.set_lcd_contrastcCsjd|krdksnJ‚|dvs&J‚d|kr:dks@nJ‚| |jtdd||ƒt|ƒ¡dS)z^ led -- 0 to 3 rg -- 0 for red, 1 for green value -- 0 to 100 rr*)rrr’r"r)N)r�rWrA)r ZledZrgr”rrr Ú set_led_pinÚs  ÿzCF635Screen.set_led_pin)rrrrPrZCGROMrrZrƒr1rxr~r|r�rr�r‘r•r–r—r]rrr7r rkýs&  ÿþ5 #  rk) Z __future__rrZdisplay_commonrrcrrÚobjectr^rkrrrr Ús 7