
    eh$                        d dl Z d dlZ G d d          ZddZ	 	 ddZedk    r ed            edd	          Z ee                                            ed
            edddd          Z	 ee	                                            ed           e
                    dd           e                    dd            ee                                           dS dS )    Nc                   L    e Zd ZdZd Z	 	 ddZddZdd	Zd
 Zd Z	d Z
d ZdS )DeadbandControllerz
    Controls deadbands for duty and polarity signals.
    Allows configurable timing offsets for rising and falling edges.
    c                     d| _         d| _        d| _        d| _        d| _        d| _        d | _        d | _        t          j	                    | _
        d S )Ng        F)duty_rising_deadbandduty_falling_deadbandpolarity_rising_deadbandpolarity_falling_deadbandduty_last_statepolarity_last_state
duty_timerpolarity_timer	threadingLocklockselfs    */home/morepork/Documents/CSEM/deadbands.py__init__zDeadbandController.__init__
   s\     %+!%+"(.%)/&  %#(  " N$$			    Nc                     | j         5  ||| _        ||| _        ||| _        ||| _        ddd           dS # 1 swxY w Y   dS )a  
        Configure deadband timing for signal edges.
        
        Args:
            duty_rising: Deadband for duty signal rising edge (seconds)
            duty_falling: Deadband for duty signal falling edge (seconds)
            polarity_rising: Deadband for polarity signal rising edge (seconds)
            polarity_falling: Deadband for polarity signal falling edge (seconds)
        N)r   r   r   r   r	   )r   duty_risingduty_fallingpolarity_risingpolarity_fallings        r   configure_deadbandsz&DeadbandController.configure_deadbands   s     Y 	B 	B&,7)'-9**0?-+1A.	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs   %:>>   c                 @    |                      |dz  |dz             dS )z
        Convenience method to set duty deadbands in milliseconds.
        
        Args:
            rising_ms: Rising edge deadband in milliseconds
            falling_ms: Falling edge deadband in milliseconds
             @@)r   r   Nr   r   	rising_ms
falling_mss      r   set_duty_deadbandsz%DeadbandController.set_duty_deadbands2   s;     	  !F*#f, 	! 	
 	
 	
 	
 	
r   r   c                 @    |                      |dz  |dz             dS )z
        Convenience method to set polarity deadbands in milliseconds.
        
        Args:
            rising_ms: Rising edge deadband in milliseconds
            falling_ms: Falling edge deadband in milliseconds
        r   )r   r   Nr    r!   s      r   set_polarity_deadbandsz)DeadbandController.set_polarity_deadbands?   s;     	  %.'&0 	! 	
 	
 	
 	
 	
r   c                    | j         5  | j         | j                                         d| _        || j        k    ra|r| j        }n| j        }|| _        |dk    r ||           nBt          j        |||g          | _        | j                                         n ||           ddd           dS # 1 swxY w Y   dS )z
        Apply deadband to duty signal state change.
        
        Args:
            new_state: New boolean state for duty signal
            callback: Function to call with the final state after deadband
        Nr   args)	r   r   cancelr
   r   r   r   Timerstartr   	new_statecallbackdeadband_times       r   apply_duty_deadbandz&DeadbandController.apply_duty_deadbandL   s.    Y 	$ 	$*&&((("& D000 ?$($=MM$($>M (1$ !A%%HY'''' '0omXU^T_&`&`&`DOO))++++ ###3	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$   BB44B8;B8c                    | j         5  | j         | j                                         d| _        || j        k    ra|r| j        }n| j        }|| _        |dk    r ||           nBt          j        |||g          | _        | j                                         n ||           ddd           dS # 1 swxY w Y   dS )z
        Apply deadband to polarity signal state change.
        
        Args:
            new_state: New boolean state for polarity signal
            callback: Function to call with the final state after deadband
        Nr   r(   )	r   r   r*   r   r   r	   r   r+   r,   r-   s       r   apply_polarity_deadbandz*DeadbandController.apply_polarity_deadbando   s4    Y 	$ 	$".#**,,,&*# D444 C$($AMM$($BM ,5( !A%%HY'''' +4/-YbXc*d*d*dD''--//// ###3	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$r2   c                     | j         5  | j         | j                                         d| _        | j         | j                                         d| _        d| _        d| _        ddd           dS # 1 swxY w Y   dS )z<Reset internal state tracking and cancel any pending timers.NF)r   r   r*   r   r
   r   r   s    r   reset_statezDeadbandController.reset_state   s    Y 	- 	-*&&((("&".#**,,,&*# $)D ',D$	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   AA22A69A6c                     | j         5  | j        dz  | j        dz  | j        dz  | j        dz  | j        | j        dcddd           S # 1 swxY w Y   dS )z
        Get current deadband configuration information.
        
        Returns:
            Dictionary with current deadband settings
        i  )duty_rising_msduty_falling_mspolarity_rising_mspolarity_falling_ms
duty_statepolarity_stateN)r   r   r   r   r	   r
   r   r   s    r   get_deadband_infoz$DeadbandController.get_deadband_info   s     Y 	 	"&";d"B#'#=#D&*&Cd&J'+'E'L"2"&": 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   3AAA)NNNN)r   r   )r   r   )__name__
__module____qualname____doc__r   r   r$   r&   r1   r4   r6   r>    r   r   r   r      s         
% % %& BFBFB B B B*
 
 
 

 
 
 
!$ !$ !$F!$ !$ !$F- - -    r   r   r   c                 z    t                      }|                    | |            |                    ||           |S )a  
    Create a deadband controller with symmetric deadbands.
    
    Args:
        duty_ms: Deadband for duty signal edges (milliseconds)
        polarity_ms: Deadband for polarity signal edges (milliseconds)
    
    Returns:
        DeadbandController instance
    )r   r$   r&   )duty_mspolarity_ms
controllers      r   create_deadband_controllerrH      sA     $%%J!!'7333%%k;???r   c                 l    t                      }|                    | dz  |dz  |dz  |dz             |S )a  
    Create a deadband controller with asymmetric deadbands.
    
    Args:
        duty_rising_ms: Duty signal rising edge deadband (milliseconds)
        duty_falling_ms: Duty signal falling edge deadband (milliseconds)
        polarity_rising_ms: Polarity signal rising edge deadband (milliseconds)
        polarity_falling_ms: Polarity signal falling edge deadband (milliseconds)
    
    Returns:
        DeadbandController instance
    r   )r   r   r   r   )r   r   )r8   r9   r:   r;   rG   s        r   %create_asymmetric_deadband_controllerrJ      sT     $%%J"""V+$v-*V3,v5	 #    r   __main__z"Example 1: Symmetric 5ms deadbands)rE   rF   z 
Example 2: Asymmetric deadbands            )r8   r9   r:   r;   z
Example 3: Modifying deadbands
   )r"   r#         )r   r   )r   r   r   r   )r   timer   rH   rJ   r?   printrG   r>   controller2r$   r&   rC   r   r   <module>rV      s       l l l l l l l l`   " MNRS   2 z	E
.///++A1EEEJ	E*
&
&
(
())) 
E
-...77	  K 
E+
'
'
)
)*** 
E
,---!!B1!===%%b%AAA	E*
&
&
(
()))))) r   