
    j                     Z    d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	  G d de      Z
y)aR  
 A community-contributed Python module to add support for Tuya WiFi smart universal remote control simulators

 This module attempts to provide everything needed so there is no need to import the base tinytuya module

 Module Author: Alexey 'Cluster' Avdyukhin (https://github.com/clusterm)
 Rewritten by uzlonewolf (https://github.com/uzlonewolf) for new devices and IR format conversion

 Local Control Classes
    IRRemoteControlDevice(..., version=3.3)
        This class uses a default version of 3.3
        See OutletDevice() for the other constructor arguments

    Functions:
        ir = IRRemoteControlDevice(..., control_type=None)
            -> will immediately connect to the device to try and detect the control type if control_type is not provided
               control_type=1 for older devices using DPS 201/202
               control_type=2 for newer devices using DPS 1-13

        ir.detect_control_type()
            -> polls device status to try and detect the control type

        ir.send_command( mode, data={} )
            -> sends a command to the device
               when mode is 'send', data is parsed for the data to send
                   data = { "base64_code": "..." } or
                   data = { "head": "...", "key": "..." }
               all other commands are sent though as-is without data

        ir.study_start()
        ir.study_end()
            -> start or end a study session

        ir.receive_button( timeout )
            -> call this method and press button on real remote control to read its code in Base64 format
               timeout - maximum time to wait for button press

        ir.send_button( base64_code )
            -> simulate a learned (raw base64-encoded) button press

        ir.send_key( head, key )
            -> send a head/key pair

        ir.build_head( freq=38, bit_time=0, zero_time=0, one_time=0, bit_time_type=1, timings=[], convert_time=True )
            -> build a 'head' section
               'freq' is in kHz
               if bit_time, zero_time, or one_time evaluate to False, timings are taken from timings[] as needed
               if convert_time is True, timings are in microseconds and converted as needed.
                   when False, timings are sent as-is

        IRRemoteControlDevice.print_pulses ( pulses )
            -> pretty-print a sequence of pulses and gaps length

        IRRemoteControlDevice.base64_to_pulses ( code_base_64 )
            -> convert Base64-encoded button code to sequence of pulses and gaps length

        IRRemoteControlDevice.pulses_to_base64 ( pulses )
            -> convert sequence of pulses and gaps length to Base64-encoded button code

        IRRemoteControlDevice.head_key_to_pulses ( head='...', key='...' )
            -> convert head/key pair to sequence of pulses and gaps
               'head' can be None when the key is raw bytes in base64
               'key' must begin with '00' through 'FF' when it is not raw bytes in base64

        IRRemoteControlDevice.pulses_to_head_key ( pulses, fudge=0.1, freq=38 )
            -> attempts to pack a sequence of pulses and gaps into a head/key pair
               pulses/gaps within 10% (fudge=0.1) are assumed to be the same and are merged together

        IRRemoteControlDevice.hex_to_pulses ( code_hex )
            -> convert HEX-encoded button code to sequence of pulses and gaps length
               HEX-encoded codes are used in the Cloud API

        IRRemoteControlDevice.pulses_to_hex ( pulses )
            -> convert sequence of pulses and gaps length to HEX-encoded button code
               HEX-encoded codes are used in the Cloud API

        IRRemoteControlDevice.nec_to_pulses ( address, data=None )
            -> convert a 32-bit NEC button code (when data=None) or a 8/16-bit address and 8-bit data to sequence of pulses and gaps length
               address - a 32-bit NEC button code (when data=None), or a 8-bit or 16-bit address
               data - 8-bit data when address is 8-bit or 16-bit

        IRRemoteControlDevice.pulses_to_nec ( pulses )
            -> convert sequence of pulses and gaps length to a NEC button code
               returns an array of dicts containing 'type'="nec", 'address' and 'data' (if valid), 'uint32' raw data, and 'hex' hex-encoded data

        IRRemoteControlDevice.samsung_to_pulses ( address, data=None )
            -> similar to nec_to_pulses() but for the Samsung format (start pulse 4.5ms instead of 9ms)

        IRRemoteControlDevice.pulses_to_samsung ( pulses )
            -> similar to pulses_to_nec() but for the Samsung format
               returns same array of dict as pulses_to_nec() but with 'type'="samsung"

        IRRemoteControlDevice.pronto_to_pulses ( pronto )
            -> convert a Pronto code string to sequence of pulses and gaps length

        IRRemoteControlDevice.pulses_to_pronto ( pulses )
            -> convert sequence of pulses and gaps length to a Pronto code string

        IRRemoteControlDevice.width_encoded_to_pulses ( uint32, start_mark=9000, start_space=4500, pulse_one=563, pulse_zero=563,
          space_one=1688, space_zero=563, trailing_pulse=563, trailing_space=30000 )
            -> flexible uint32 to sequence of pulses encoder
               default values are for NEC format, set start_mark=4500 for Samsung format

        IRRemoteControlDevice.pulses_to_width_encoded ( pulses, start_mark=None, start_space=None, pulse_threshold=None, space_threshold=None )
            -> flexible space-width or pulse-width to uint32 decoder
               converts sequence of pulses to a 32-bit unsigned integer
               recommended *_threshold is `(length_of_zero + length_of_one) / 2`

    N   )DevicelogCONTROLc                   >    e 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dZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z# fd"Z$d# Z%dCd$Z&d% Z'd& Z(dDd'Z)d( Z*d) Z+e,d*d+d+d+d,g d-fd.       Z-e,dCd/       Z.e,d0        Z/e,d1        Z0e,d2        Z1e,dEd3       Z2e,d4        Z3e,d5        Z4e,d6        Z5e,d7        Z6e,d8        Z7e,dFd9       Z8e,dGd:       Z9e,dHd;       Z:e,dCd<       Z;e,d=        Z<e,dCd>       Z=e,d?        Z>e,d@        Z?e,dA        Z@e,dB        ZA xZBS )IIRRemoteControlDevicesend_ir20120212345611789121013control
study_codeir_codekey_code	key_code2	key_code3	key_code4	key_study
key_study2
key_study3
key_study4
delay_timetypedelayheadkey1z!@#$%^&*()QWRLTXKVNM{}[]JUP<>|=HS~c                     d|vs|d   sd|d<   d}d|v r|d   }|d= t        t        | 
  |i | d| _        || _        | j                  s| j                          y y )Nversiongffffff
@r   control_typeT)superr   __init__disabledetectr+   detect_control_type)selfargskwargsr+   	__class__s       S/DATA/.local/lib/python3.12/site-packages/tinytuya/Contrib/IRRemoteControlDevice.pyr-   zIRRemoteControlDevice.__init__   sz    F"&*; #F9V#!.1L~&#T3TDVD!(  $$& !    c                 z   | j                   }| j                  }| j                  d       | j                  d       d| _        | j                          d| _        | j                          d| _        | j                         }|rwd|v rs| j                  |d   v rt        j                  d       d| _        n-| j                  |d   v rt        j                  d       d| _        | j                  d       }|rd|v rs| j                  st        j                  d       | j                  |       | j                  |       y )	N   Tr   r   dpszDetected control type 1zDetected control type 2z>Detect control type failed! control_type= must be set manually)connection_timeoutsocketPersistentset_socketTimeoutset_socketPersistentr+   	study_endstatus
DP_SEND_IRr   debugDP_MODE_send_receivewarning)r0   old_timeoutold_persistr>   s       r4   r/   z)IRRemoteControlDevice.detect_control_type   s    --++#!!4)&&-/		46$%!.		46$%!''-F &   KKY[-!!;0r5   c                 0   |i }| j                   st        d      |dk(  rl| j                   dk(  rt        j                  dt        j                  di}d|v r-d|t        j
                  <   d|d   z   |t        j                  <   n7d	|v r3d
|v r/|d	   |t        j
                  <   d|d
   z   |t        j                  <   | j                  t        j                  t        j                  |      d       y | j                   dk(  rd|v rdnd}t        j                  |t        j                  di}d|v r|d   |t        j                  <   n4d	|v r0d
|v r,|d	   |t        j                  <   |d
   |t        j                  <   | j!                  |d       y y | j                   dk(  rHt        j                  |i}| j                  t        j                  t        j                  |      d       y | j                   dk(  r#| j                  t        j                  |d       y y )NzIRRemoteControlDevice: control_type has not been detected. Pass control_type=1 (DPS 201/202) or control_type=2 (DPS 1-13) to the constructor, or call detect_control_type() first.sendr7   r	   r   base64_code r   r'   key0T)nowaitr   	study_key)r+   RuntimeErrorr   NSDP_CONTROL	NSDP_TYPE	NSDP_HEAD	NSDP_KEY1	set_valuer?   jsondumpsrA   DP_CODE_TYPEDP_KEY_STUDYDP_HEADDP_KEY_CODEset_multiple_values)r0   modedatacommands       r4   send_commandz"IRRemoteControlDevice.send_command   s   <D  K 
 6>  A%)66	)33Q
 !D(?AG1;;<?BT-EX?XG1;;<t^?CF|G1;;<?BT%[?PG1;;< 5 @ @$**WBU^bd""a'&3t&;{)114)66 !D(BF}BUG1>>?t^=A&\G199:AEeG1==>(('$(@ ( !#-::DBGNN1<<djj>QZ^N`!#NN1994NN $r5   c                 &    | j                  d       y )Nstudyr^   r0   s    r4   study_startz!IRRemoteControlDevice.study_start   s    7$r5   c                 &    | j                  d       y )N
study_exitra   rb   s    r4   r=   zIRRemoteControlDevice.study_end   s    <)r5   c                    t        j                  d       | j                          | j                          d }d }d}| j                  }t        j
                         |z   }	 |t        j
                         kD  r%t        t        j
                         |z
        }|dk  rd}| j                  |       t        j                  d       | j                  d       }|d k(  rt        j                  d       nt        |      t        k7  sd|vrt        j                  d|       |}n}| j                  |d   v r|d   | j                     }d}nW| j                  |d   v r|d   | j                     }d}n1t        j                  d	|       |}|t        j
                         kD  r%| j                  |       |r| j                  |       | j                          |S # | j                  |       w xY w)
NzReceiving buttonFr7   zWaiting for button...Timeoutr8   zUnexpected response: %rTzUnknown DPS in response: %r)r   r@   r=   rc   r9   timeroundr;   rB   r%   dictDP_LEARNED_IDDP_LEARNED_REPORTprint_pulses)r0   timeoutresponseresponse_codefoundrD   end_at_timetimeos           r4   receive_buttonz$IRRemoteControlDevice.receive_button   s   		$% --iikG+ 	0		+diikK7819ae&&u-		12--d3t#IIi((^t+uH/DII7B$,M''8E?:$,UOD4F4F$GM E++x>$,UOD4J4J$KM E II;XF$,M7 		+> "";/}. 	 "";/s    D;G G&c                 |    t        j                  d|z          | j                  |       | j                  dd|i      S )NzSending Learned Button: rG   rH   )r   r@   rm   r^   )r0   rH   s     r4   send_buttonz!IRRemoteControlDevice.send_button1  s:    		-;<;(  &=+*FHHr5   c                 Z    t        j                  d||       | j                  d||d      S )NzSending Key: %r / %rrG   )r'   rJ   )r   r@   r^   )r0   r'   rJ   s      r4   send_keyzIRRemoteControlDevice.send_key6  s+    		)46  &D*FHHr5   &   r   r7   Tc                    t        |      }t        | dz        } |st        |      dkD  r
|d   }|dd  }|st        |      dkD  r
|d   }|dd  }|st        |      dkD  r
|d   }|dd  }|r\d| z  }t        ||z        }t        ||z        }t        ||z        }t        t        |            D ]  }t        ||   |z        ||<    d|| fz  }	|	dt        |      dz   |||fz  z  }	|D ]
  }|	d|z  z  }	 |	S )	Nd   r   r7        j@z%02X%04X0000000000z%02X%04X%04X%04X   z%04X)listri   lenrange)
freqbit_time	zero_timeone_timebit_time_typetimingsconvert_time	time_baseir'   s
             r4   
build_headz IRRemoteControlDevice.build_head:  s4   w-dSj!CL1,qzHabkGS\A-
IabkGCL1,qzHabkG 4Ih24Hy946Ih24H3w<("GAJ$:<
 ) $}d&;;"c'lQ&6)X%VVVAFQJD  r5   c           	      r   |st         }t        |       t        k(  r| }nt        j	                  |       }ddj                  t        t        |            D cg c]  }|dz  dk(  rdnd ||     c}      z   }t        j                         t        j                  k  rt        j                  |       |S c c}w )Nz Pulses and gaps (microseconds):  r   r   pg)r   r%   r~   r   base64_to_pulsesjoinr   r   getEffectiveLevelloggingDEBUGr@   )rH   use_logpulsesr   messages        r4   rm   z"IRRemoteControlDevice.print_pulsesW  s    #$ F*;;KHF4sxxuz{~  @F  |G  vH  AI  vHpq1q5TU:C[^C_`fgh`i_jAk  vH  AI  8J  J  "gmm3IIw  AIs   B4
c                     t        |       dz  dk(  r| j                  d      r| dd  } t        j                  |       }dt        |      dz	  z  }t	        t        j                  ||            S )N   r7   r   z<%dH)r   
startswithbase64	b64decoder~   structunpack)code_base_64	raw_bytesfmts      r4   r   z&IRRemoteControlDevice.base64_to_pulsesc  sf    |q A%,*A*A#*F'+L$$\2	I!+,FMM#y122r5   c                     dt        t        |             z   dz   }t        j                  t	        j
                  |g|        j                  d      S )N<Hascii)strr   r   	b64encoder   packdecode)r   r   s     r4   pulses_to_base64z&IRRemoteControlDevice.pulses_to_base64l  sD    CF$$s*S!:6!:<CCGLLr5   c                 D   t        |      dk  rt        d      | st        j                  |      S t        |       dk  rt        d      t        j                  |       } t        j                  d| d d       \  }}}}}|dz  }d|z  }t        j                  d | }		 t        |d d d	      }
|dd  }|dk(  rd}n|dk(  rd}nt        d|z        t        |       |dz   k7  rt        d|dz   dz  z        d|z  }t        j                  || dd        }i }t        |      D ]  }t        |||   z        ||	|   <    	 d}|r9d}|D ]  }||	vr n||z  }|dz  } ||d  }|snt        j                  dt        j                  |d d             \  }}|dd  }|dk7  r_d}d}d}|D ]@  }t        |j                               }|dk  s|dkD  s
|dkD  r|dk  r n||z  }|dz  }|dz  }B t        |      dz  r!|dz  }nt        |dz   dz        }|dz  }|d | }||d  }t        j                  |      }|rD|d   }|dd  }t        d      D ])  }|s n%|dz  dk(  r	||d   z  }n||d   z  }|dz  }|dz  }+ |rD|r9	 |D cg c]  }||   	 c}S #  t        d
      xY wc c}w )Nr   z#"key" must be at least 4 characters   z%"head" must be at least 18 charactersz>BHHHH	   r   r|      z1First 2 digit of "key" must be a hexidecimal byter7   )z@@@#)r   z@$zUnhandled "head" type: %dz"head" must be %d charactersz>%dHrI   r   z>BB0   F   9   A   rK            )r   
ValueErrorr   r   	bytearrayfromhexr   r   KEY1_SYMBOL_LISTintr   ri   printordupper)r'   rJ   headtype	timescaleunused1unused2num_timingsheadlentimebasesymbolsrepeatbit_timimgsr   r   symbol_timingsr   expandedcntcbytsbitsr\   c2ds                           r4   head_key_to_pulsesz(IRRemoteControlDevice.head_key_to_pulsesq  sT   s8a<CEE(993@@t9r>EGG  $(=C]]HVZ[]\]V^=`:)Wg{/i''88+F	T#bq'2'F !"g
 q=(K](K9HDFFt9#<ANPP {"--d12h0{#A).x'!*/D)EN71:& $   CG#Aq  cd)C  y/@/@#bq'/KMJD$ab'CqyAQWWYBDyBI"t)T	AID1HCAID  IMCKD TAXN,Qh4Cycd)C$$d,DGABxqADT) KN2 KN2!GAAID " W r  ,448aq!844[	TQSSX 5s   J >JJc                 F   t        j                  d      }t        |       dk  ry t        |       dz  dk(  rt        |       } | j	                  | d          i }| D ]  }||vrd||<   ||xx   dz  cc<    t
        j                  ||      }	 |x}
}|j                  d|       d}i }i }i }d}	| D ]  }|	 }	|	rV||
v r|
|   n|}||vr+t        t        |      dz         }d|d	||<   ||vr|dg||<   n||   d
xx   dz  cc<   |||   d   z  }^||v r||   n|}||vr+t        t        |      dz         }d|d	||<   ||vr|dg||<   n||   d
xx   dz  cc<   |||   d   z  } |j                  d|       |j                  d|       ddd}ddd}|D ]!  }||   d
   |d
   kD  s||   d
   |d
<   ||d<   # |D ]!  }||   d
   |d
   kD  s||   d
   |d
<   ||d<   # |d   }||   d   }|d   }||   d   }|j                  d||       |j                  d||       d d g}i i g}ddg}t        d      D ]  }|j                  d       |dk(  r|n|}|sdnd}|j                  d||       i }t        |t        |      d      D ]9  }||   |k(  s|||dz    }t        |      dk(  s#||vrd||<   -||xx   dz  cc<   ; |j                  d|       ddg}ddg}|D ]  }||   |d   kD  s||   |d<   ||d<    |D ]$  }||d   k7  s||   |d   kD  s||   |d<   ||d<   & |j                  d||       |D ]
  }d||   d<    d} d}!|}"|d   r.|d   s)|d   d   }#d||#   d<   |d   d   }$d||$   d<   |d   }%d}&n |d   r|d   r|d   d   }#|d   d   }'||#   d   ||'   d   k(  rgdx||#   d<   ||'   d<   |d   d   }$|d   d   }(||$   d   ||(   d   k  rd||$   d<   d||(   d<   |d   }%|d   }&nd||$   d<   d||(   d<   |d   }%|d   }&n||#   d   ||'   d   k  rd||#   d<   d||'   d<   |d   }%|d   }&nd||#   d<   d||'   d<   |d   }%|d   }&|d   d   }#|d   d   }'||#   d   ||'   d   k(  rdx||#   d<   ||'   d<   |d   }!|dd  }"n
d||#   d<   d} |j                  d|       d x})}*|D ]  }||   d   dk(  r|})||   d   dk(  s|}*  |)rX|*rV||)   d   ||*   d   k(  rEd||<   t        t
        j                  dd        }+d||*   d<   |D ]  }||   d   dk(  sd||   d<    n!d||<   t        t
        j                  dd        }+i },|D ]  }||   d   s||   d   }-||   d   |,|-<     d}.|j                  d|       |D ]X  }||   d   r||   d   }/|/|,v r|,|/   ||   d<   $|+s|j                  d       d}. n |+j                  d      }0|0||   d<   |0|,|/<   Z |j                  d |       |j                  d!|,       |.r|j                  d"       |j                  d#%&       d}1|D ]  }-|1||-   d   z  }1 |j                  d$|1       | r<|r|"d   }-|!||-   d   z  }!dx}2}3g }4d}5t        |t        |"      dz   d      D ]  }|"||dz    }d}6|D ]  }-|6||-   d   z  }6 ||%k(  r&|5|6z  }5|2dz  }2|2d%k(  s4|4j	                  |3       dx}2}3J||&k(  r1|5|6z  }5|2dz  }2|3dd%|2z
  z  z  }3|2d%k(  sj|4j	                  |3       dx}2}3|2s|4r9t
        j                  |2|3|4      }7t        |7      t        |5      k  r|!|7z  }!n|!|5z  }!dx}2}3g }4d}5|!|6z  }! |j                  d&|!       t        |!      t        |1      kD  r'|j                  d'       |1}!n|j                  d(       |1}!|!||<   i ||<   |D ]  }||   d   }8||   d   ||   |8<     |j                  d       |d   s|d   }9|d   }:|d   };nQ|d   s|d   }9|d   }:|d   };n<t        |d         t        |d         k  r|d   }9|d   }:|d   };n|d   }9|d   }:|d   };g },t
        j                  D ]<  }-|-|:v r|,j	                  |:|-          t        |,      d)k  r|,j	                  d*       < n t
        j                  ||;|,+      }<|j                  d,|d   |d          |j                  d-|d   |d          |j                  d.|<|9       |j                  |       |j                  |       |<d/|9z   fS )0Npulses_to_head_keyr   r7   r   Fzmerged pulse+space map: %rrI   r   )countcharr   r   a   zsymbol pattern: %rzsymbol list: %r)r   rh   rh   zmost common space: %r %rzmost common pulse: %r %rpulsespacez&Trying encoding_type %r - character %rzpat_counts: %rzpat_max: %r, pat_next_max: %rT@#DEADBEEF$zinitial symbol list: %rz!symbol list before assignment: %rzFCannot convert pulses to head/key, too many unique pulse/space values!z!symbol list after assignment:  %rzunique time symbols: %rz!! need_abort !!z#zero sequence: %r, one sequence: %rzraw symbol pattern: %rr   zbit symbol pattern: %rzSBitfield pattern is longer than pulse/space symbol lists, using shorter symbol listzNot attempting bitfieldr}   r{   )r   r   r   z#Space-Width Encoded: %r Timings: %rz#Pulse-Width Encoded: %r Timings: %rznew pattern: %r / %r01)r   getChildr   r~   appendr   _merge_similar_pulse_timesr@   chrr   r   pop_build_key_bitfieldr   )=r   fudger   mylogps_countcurrent_ps_timeps_mapp_counts_countis_pulsep_maps_mapsymbol_patternsymbol_list	p_key_map	s_key_mapknext_letterpmaxsmaxspace_letterpulse_letterencoding_type_shortestencoding_type_symbol_listbit_time_typesencoding_typecurrent_letterencoding_type_name
pat_countsr   pat_maxpat_next_maxtry_bitfieldbit_symbol_patternfull_symbol_patternaa2zero_symbol
one_symbolbb2bit_start_symbolbit_zero_symbolsymbols_availabletime_symbolsr   
need_aborttsraw_symbol_patternr   r\   r   removedk_symbol_patternnew_bitfieldjr(   new_symbol_listr   headers=                                                                r4   r   z(IRRemoteControlDevice.pulses_to_head_key  s   24v;?v;?a&\FMM&)$%Oh.,-))Q.)	  &
 'AA8UT 6 #"EEKK4f= 		%O#|H.=.FE/*O I%"%c)nt&;"<K./#FIaL"+545u:K0aL)Q.))A,v"66 />.FE/*O I%"%c)nt&;"<K./#FIaL"+545u:K0aL)Q.))A,v"66;  &> 	)>;&5 Q(Q(A|G$tG}4 )!W 5W V  A|G$tG}4 )!W 5W V 
 L |F+L |F+/tE/tE"&%'H!Q #AZMKK-:a-?\\N0=7KKACUWegJM3~+>C!!$6&q1-A1v{J.,-JqM&qMQ.M D KK):7 "gGr7La=71:-!+AGAJ!"GAJ    
?z!}|A'F&0mLO&'LO  
 KK8'<P !$)Aq! !  L!#"0qz,q/AJqM$'Aq!QZ]%(B"%aj'
QAJqM OA&q>!$Aq(99<??KN1%Aq(9 AB%a+B"2q)KOA,>>-0B*-0B*&-aj%1!_
-0B*-0B*&21o%,QZ
 #1~a(;q>!+<<,/Aq),/Aq)&-aj%1!_
,/Aq),/Aq)&21o%,QZ

1A$Q*A"1~a(KN1,==@CCAq)KN1,=-;A->*.<QR.@+,/Aq)',KK1;? 265 q>!$+'($ ^A&#-&'O	 !  ODT8UVW8X\ghw\xyz\{8{01}-$()>)O)OPQPR)S$T!25O,Q/$A"1~a(C/,/Aq) %
 12}-$()>)O)OPQPR)S$T! L q>!$#Aq)A&1!nQ&7LO ! JKK;[J "1~a(#Aq)AL(,8OAq) ,%mo%)
)--q2A()KN1%&'LO ! KK;[JKK1<@./KK>ZY "$#"k!nQ&77" $KK13EG  +A.A&+a.*;;&ts3F/G/I1NA+Aac2A')$(KN1,==( K'#33	19 KK/*+OD4j#33	a$h/19 KK/*+OD44+@+T+TVZ\`bf+hL"<03w<? 2l B 2 2g = 2&'t!"$*.>>*; O< 57IK )*S1C-DDKK!vx);&68%7" 5G"=17:%m4 N1%>I!nQ>O)-8; !] (d 	R%a()!,D7:O*1-M'*)!,D7:O*1-M'*+s3I!3L/MM)!,D7:O*1-M)!,D7:O*1-M &77AO###_Q%79\"Q&##S* 8 '11Mco1q:<RST<UWpqrWsu:<RST<UWpqrWsu+VT;Y Y td{""r5   c                 H   i }d}|rd}d }| D ]3  }||z  }||z
  }||z   }| D ]  }	||	k(  r	|	|k\  s|	|k  s||	f} n |s3 n |rZd}|d   }
|d   }| |
   | |   z   }t        |
|z   dz        }| |
= | |= || |<   |||
<   |||<   |D ]  }||   |
k(  s	||   |k(  s|||<    |r|S )NTFr   r7   r   )ri   )r   r   r   modmerger   pfudgepminr   p_checkr  r  	new_countnew_pr   s                  r4   r   z0IRRemoteControlDevice._merge_similar_pulse_timesi  s   CE#*(50&/&/&G&'1 $7d?!0' :  '  $+ !H!H#AJ3	q1uk*AJAJ!* a aAQx1}aA#(a = D r5   c           	      r   g }d}d}g }d}d}d}d}d}	| D ]  }
|	r y | }|rt        d|
       |
dk\  rZ|
dk  rU|dkD  rC|s y t        |      dz  |z   }|dk(  r|dk(  rn|dk  s|dkD  r y |j                  ||||||f       d	}dx}x}x}}g }x|
d
k\  rZ|
dk  rU|dkD  rC|s y t        |      dz  |z   }|dk(  r|dk(  rn|dk  s|dkD  r y |j                  ||||||f       d}dx}x}x}}g }|
dkD  s|
dk  r y |dk(  s y t        d|
       |dk(  r|
d
k\  r	|
dk  rd}
|
dk\  r	|
dk  rd} y |
dkD  rA|dkD  s&|s y t        |      dz  |z   }|j                  ||||||f       d	}dx}x}x}}g }`|
dk\  r(|
dk  r#|dz  }|dk(  sv|j                  |       dx}}|
dk\  r3|
dk  r.|dz  }|dd|z
  z  z  }|dk(  s|j                  |       dx}}d}	 |dkD  rA|sy t        |      dz  |z   }|dk(  r|dk(  rn|dk  s|dkD  ry |j                  ||||||f       |sy d}|D ]  }|dz  }|dk(  r|d   |d   d   k7  s y  d}|d   d   ddddd|d   d   di}|D ]N  }|d   |vs|d   |vr y |||d      ||d      z   z  }|t        j	                  |d   |d   |d         z  }|d z  }P |S )!Nr   Fr   i  it'  r   i  r{   (#  iH  i    i  i  r  i~  i  r7   ix  i  TrI   %^&   *r}   r   r   z@*)r   r   r   r   r   )r   resultsr   r\   r   start_pulsestart_space
last_spacer   fail_if_againr   bits2r   rresult_stringr   s                   r4    pulses_to_space_encoded_head_keyz6IRRemoteControlDevice.pulses_to_space_encoded_head_key  s   
%O#|HsO-"d*%/G"Q*#'!$TQ$ 6 A:+*= "QY%#+#'k4tU_(`b"&K=>>D>4>+
D$,D1H"Q*#'!$TQ$ 6 A:+*= "QY%#+#'k4tU_(`b"&K=>>D>4>+
D$s*o.C A%sO-!#&$.?d3J&*(D0_5L&*  $&-&?#.'+%(Y]d$:E $NN[+tTSWYc,df*.KEFFDF4F+
#%D(C/Os4J	19 KK-*+OD4(D0_5L	q4x119 KK-*+OD4(,c  &d ?Y]d*EzkT1eckNN[+tT4TVAQJEztwqz!}$  AJqM3c4gajmSRAt7"ad'&9WQqT]WQqT]::M2FF!aPQdTUVWTXZZMT!M  r5   c                 h    | t        |      dz  z   }dd|fz  }|D ]
  }|d|z  z  } | r|d|z  z  }|S )Nr   z%02X%02Xr   z%02X)r   )r   bitdatar   numbitsr/  r  s         r4   r   z)IRRemoteControlDevice._build_key_bitfield  sR    #d)a-("a\1AVaZ'M Vg--Mr5   c           	          t         j                  |       }t        dt        |      d      D cg c]  }t        j                  |||dz    d      ! c}S c c}w )Nr   r   little)	byteorder)bytesr   r   r   r   
from_bytes)code_hexr   xs      r4   hex_to_pulsesz#IRRemoteControlDevice.hex_to_pulses  sT    MM(+	NSTUWZ[dWeghNijNiy1Q3/8DNijjjs   $Ac                 f    dj                  | D cg c]  }|dz	  |dz  z  dz  d c}      S c c}w )NrI   r   i  04x)r   )r   r:  s     r4   pulses_to_hexz#IRRemoteControlDevice.pulses_to_hex!  s=    wwPAQ!VQ/69#>?PQQPs   .c	                     ||g}	||g}
||g}t        ddd      D ]  }|	| d|z  z  r|
n|z  }	 |	j                  |       |	j                  |       |	S )N   r"  r7   )r   r   )uint32
start_markr*  	pulse_one
pulse_zero	space_one
space_zerotrailing_pulsetrailing_spacer   onezeror   s                r4   width_encoded_to_pulsesz-IRRemoteControlDevice.width_encoded_to_pulses%  sg    {,9&j*r2r"AVqAv.cD8F #~'~'r5   c                 T   g }t        |       dk  rt        j                  d       |S ||t        j                  d       |S |Ot        |       dk\  rA| d   |dz  k  s| d   |dz  kD  r+| dd  } t        |       dk\  r| d   |dz  k  r| d   |dz  kD  r+t        |       dk\  r|-| d   |dz  k  s| d   |dz  kD  rt        j                  d       |S |-| d   |dz  k  s| d   |dz  kD  rt        j                  d	       |S | d
d  } d}t        ddd      D ]`  }d x}}	|| d   |k\  rd}nd}|| d   |k\  rd}	nd}	|&|	$||	k7  rt        j                  d|z         |c S |	}
n||	}
n|}
||
|z  z  }| d
d  } b | d
d  } ||g}n||vr|j	                  |       t        |       dk\  r|S )ND   zKLength of pulses must be a multiple of 68! (2 start + 64 data + 2 trailing)z<"pulse_threshold" and/or "space_threshold" must be supplied!r   g      ?g      ?r7   z(The start mark is not the correct lengthz)The start space is not the correct lengthr   r@  r"  zYBoth "pulse_threshold" and "space_threshold" are supplied and bit %d conflicts with both!)r   r   r@   r   r   )r   rB  r*  pulse_thresholdspace_thresholdretrA  r   pulse_matchspace_matchress              r4   pulses_to_width_encodedz-IRRemoteControlDevice.pulses_to_width_encoded0  sA   v;IIcdJ#/*AIITUJ!v;"$&)zD7H*IVTUYZdgkZkMl v;"$&)zD7H*IVTUYZdgkZkMl 6{b %!9
T 12fQi:PTCT6UIIHIJ&!9d 23vayKRVDV7WIIIJJABZFF2r2&,00k".ayO3&'&'".ayO3&'&'++2I"k1		"}  AB  #B  C"
%C (%C%C#("3 '6 ABZF{js"

F$[ 6{b ^ 
r5   c                 ^    |dz
  }d}t        |      D ]  }| d|z  z  r|d|z  z  }|dz  } |S )Nr7   r   )r   )r\   r   shiftoutr   s        r4   _mirror_bitsz"IRRemoteControlDevice._mirror_bitso  sG    qtAqAvqEz!QJE  
r5   c                 @   || }n| dk  r!t         j                  |       } | dz  | dz  z  } n7t         j                  | dz	  dz        dz  t         j                  | dz        z  } t         j                  |      }|dz  |dz  z  }| dz  |z  }t         j                  |      S )N   r      r   r   rX  rK  addressr\   rA  s      r4   nec_to_pulsesz#IRRemoteControlDevice.nec_to_pulsesy  s     <F}/<<WE"a<GdN;0==1PT?TUYZZ^s  _A  _A  BI  LP  BP  _Q  Q(55d;DAI$+.Dmt+F$<<fFFr5   c                    g }t         j                  | dd      }|D ]  }t         j                  |dz	  dz        }t         j                  |dz	  dz        }t         j                  |dz	  dz        }t         j                  |dz        }||dz  k7  r|dz  |z  }d|d d d	|z  d
}||dz  k(  r
||d<   ||d<   |j                  |        |S )Nr   e  rB  rO     r[  r   r   nec%08Xr%   rA  r^  r\   hexr^  r\   r   rT  rX  r   	r   rP  rS  codeaddraddr_notr\   data_notr   s	            r4   pulses_to_necz#IRRemoteControlDevice.pulses_to_nec  s    #;;VPTfj;lD(55trzT6IJD,9942::MNH(55tqyD6HID,99$+FH4(	X-4D$W]`dWdfA4(#) &	JJqM  
r5   c                     || }nAt         j                  |       } t         j                  |      }| dz  | dz  z   |dz  z   |dz  z   }t         j                  |d      S )Nrc  r   r   r[  r!  )rB  r\  r]  s      r4   samsung_to_pulsesz'IRRemoteControlDevice.samsung_to_pulses  sg    <F+88AG(55d;Dm26$!)DtTF$<<fQU<WWr5   c                 4   g }t         j                  | dd      }|D ]x  }|dz	  dz  }|dz	  dz  }|dz	  dz  }|dz  }d|d d d	|z  d
}||k(  r8||dz  k(  r0t         j                  |      |d<   t         j                  |      |d<   |j                  |       z |S )Nr!  ra  rb  rc  r[  r   r   samsungre  rf  r^  r\   rh  ri  s	            r4   pulses_to_samsungz'IRRemoteControlDevice.pulses_to_samsung  s    #;;VPTfj;lDBJ$&D
d*HAI%Dd{H#td[adh[hjAxDX_$=4AA$G)1>>tD&	JJqM  
r5   c                    g }| j                  d      D cg c]  }t        |d       } }| d   }| d   }| d   }| d   }|dk7  r|S |dk  s|dkD  r|S | d	d  } |d
z  }t        d|dz  d      D ]*  }|t        | |   |z        t        | |dz      |z        gz  }, | |dz  d  } t        d|dz  d      D ]*  }|t        | |   |z        t        | |dz      |z        gz  }, |S c c}w )Nr   r   r   r7   r   r}   Z      r   u9% &?)splitr   r   ri   )prontorP  r:  ptyper   	pair1_len	pair2_lenr   s           r4   pronto_to_pulsesz&IRRemoteControlDevice.pronto_to_pulses  s)   &,ll3&78&7#a*&78q	!91I	1I	A:Jb=HsNJHq)A+q)AE&)h./vac{X7M1NOOC *	!%q)A+q)AE&)h./vac{X7M1NOOC *
% 9s   C c                     d}d|z  dz  }ddt        |dz        dt        |       dz	  fz  }| D ]  }|dt        ||z        z  z  } |S )Ng     @r7   g    .Az%04X %04X %04X %04Xr   rw  z %04X)ri   r   )r   r   scalerP  r   s        r4   pulses_to_prontoz&IRRemoteControlDevice.pulses_to_pronto  sc     TY&#q%h*?CKSTDT&UUA7U1U7^++C 
r5   c                    g }| j                  d      D cg c]  }t        |d       } }| d   }| d   }| d   }| d   }|dk7  ry t        d|z  dz        d	z  }| d
d  } |dz  }t        d|dz  d      D ]*  }|t        | |   |z        t        | |dz      |z        gz  }, | |dz  d  } t        d|dz  d      D ]*  }|t        | |   |z        t        | |dz      |z        gz  }, t        j                  ||      S c c}w )Nr   r   r   r7   r   r}   g     OAr{   
   r   rw  )r   )rx  r   ri   r   r   r   )	ry  rP  r:  rz  r   r{  r|  r   r   s	            r4   pronto_to_head_keyz(IRRemoteControlDevice.pronto_to_head_key  sC   &,ll3&78&7#a*&78q	!91I	1I	A: Y)C/025Hq)A+q)AE&)h./vac{X7M1NOOC *	!%q)A+q)AE&)h./vac{X7M1NOOC * %7747II) 9s   C<)N)   )g?ry   )r   r!  3  r  i  r  r  i0u  )NNNN)r   )C__name__
__module____qualname__CMD_SEND_KEY_CODEr?   rk   rA   rl   rX   rY   DP_KEY_CODE2DP_KEY_CODE3DP_KEY_CODE4rW   DP_KEY_STUDY2DP_KEY_STUDY3DP_KEY_STUDY4DP_SEND_DELAYrV   rO   NSDP_STUDY_CODENSDP_IR_CODENSDP_KEY_CODENSDP_KEY_CODE2NSDP_KEY_CODE3NSDP_KEY_CODE4NSDP_KEY_STUDYNSDP_KEY_STUDY2NSDP_KEY_STUDY3NSDP_KEY_STUDY4NSDP_DELAY_TIMErP   
NSDP_DELAYrQ   rR   r   r-   r/   r^   rc   r=   rt   rv   rx   staticmethodr   rm   r   r   r   r   r   r0  r   r;  r>  rK  rT  rX  r_  rn  rp  rs  r}  r  r  __classcell__)r3   s   @r4   r   r   y   s   !JMGGKLLLLMMMMLL"OLM N N N N"O"O"O"OIJII:'"1:'OR%*6pI
I a1qPQ[]lp  8 	 	 3 3 M M ~5 ~5B s# s#j % %N } }~   k k R R   < <|   G G   $ X X     ,   J Jr5   r   )__doc__r   rT   r   r   rh   corer   r   r   r    r5   r4   <module>r     s3   l\      ' 'wJF wJr5   