
    >[hI%                     @    d dl Z d dlZd dlmZmZ  G d d          ZdS )    N)datetime	timedeltac                   t    e Zd ZdZ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S )TransmissionControllerz5Handles transmission cycle logic and state managementNc                     || _         || _        |pd | _        d| _        d | _        d | _        d| _        d| _        d| _        i | _	        t          j                    | _        d| _        d | _        d| _        d S )Nc                 &    t          d|            S )Nz[TX] )print)msgs    8/home/morepork/Documents/CSEM/transmission_controller.py<lambda>z1TransmissionController.__init__.<locals>.<lambda>   s    u]S]]?S?S     idle<            ?Fr   )gpio_controllerdata_loggerstatus_callbackcycle_statecycle_timercycle_threadtransmit_time
pause_timecurrent_frequencygui_callbacks	threadingLock
state_lockcycle_runningcycle_start_timecycle_number)selfr   r   r   s       r   __init__zTransmissionController.__init__   s    .&.T3S3S "    "%   $.**" !%r   c                     | j         5  || _        || _        ddd           n# 1 swxY w Y   |                     d| d| d           dS )zSet transmit and pause timesNzTiming updated: zs TX, zs pause)r   r   r   r   )r"   r   r   s      r   set_timing_parametersz,TransmissionController.set_timing_parameters$   s    _ 	) 	)!.D(DO	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	XXXZXXXYYYYYs   #''c                 T    | j         5  || _        ddd           dS # 1 swxY w Y   dS )zSet transmission frequencyN)r   r   )r"   	frequencys     r   set_frequencyz$TransmissionController.set_frequency+   sv    _ 	/ 	/%.D"	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   !!c                     || _         dS )zRegister GUI update callbacksN)r   )r"   	callbackss     r   register_gui_callbacksz-TransmissionController.register_gui_callbacks0   s    &r   c                 P   | j         5  | j        dk    r#|                     d           	 ddd           dS |                     d| j         d| j         d           d| _        d	| _        t          j                    | _        d
| _	        ddd           n# 1 swxY w Y   t          j        | j        d	          | _        | j                                         |                                  | j                                        r| j                            | j                   d	S )z4Start the transmit/pause cycle with precision timingr   z!Transmission cycle already activeNFzStarting transmission cycle: zs ON, zs OFFtransmittingTr   )targetdaemon)r   r   r   r   r   r   r   utcnowr    r!   r   Thread_precision_cycle_loopr   start_start_gpio_transmissionr   is_logging_activelog_transmission_startr   r"   s    r   start_transmission_cyclez/TransmissionController.start_transmission_cycle4   s   _ 		" 		"6))$$%HIII		" 		" 		" 		" 		" 		" 		" 		"
   !qAS!q!q[_[j!q!q!qrrr-D!%D$,O$5$5D! !D		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" &,D4NW[\\\!!! 	%%''' --// 	L33D4JKKKts   "BABBBc                    | j         5  | j        dk    }d| _        d| _        ddd           n# 1 swxY w Y   | j        r | j                                         d| _        | j        r4| j                                        r| j                            d           |                                  |r2| j	        
                                r| j	                                         |                     d           dS )zStop the transmission cycler   FNr   )timeoutzTransmission cycle stoppedT)r   r   r   r   cancelr   is_alivejoin_stop_gpio_transmissionr   r5   log_manual_stopr   )r"   
was_actives     r   stop_transmission_cyclez.TransmissionController.stop_transmission_cycleN   sF   _ 	' 	')V3J%D!&D	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'  	$##%%%#D  	0!2!;!;!=!= 	0""3"/// 	$$&&&  	/$*<<>> 	/,,...9:::ts   .22c                 R    | j         5  | j        cddd           S # 1 swxY w Y   dS )zGet current cycle stateNr   r   r7   s    r   get_cycle_statez&TransmissionController.get_cycle_stateh   st    _ 	$ 	$#	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s     c                 Z    | j         5  | j        dk    cddd           S # 1 swxY w Y   dS )z%Check if transmission cycle is activer   NrC   r7   s    r   	is_activez TransmissionController.is_activem   sy    _ 	. 	.#v-	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s    $$c                    | j         | j        z   }| j        rt          j                    }|| j        z
                                  }t          ||z            }||z  }|| j        k    r|| _        || j         k     rd}nd}| j	        5  | j
        |k    rR| j        rK|dk    r | j
        dk    r|                                  n%|dk    r| j
        dk    r|                                  ddd           n# 1 swxY w Y   |dk    r$| j        t          ||z  | j         z             z   }n| j        t          |dz   |z            z   }|t          j                    z
                                  }|dk    r&t          j        t!          d|dz
                       n|dk    rt          j        |           t          j                    |k     r9| j        r2t          j        d	           t          j                    |k     r| j        2| j        dS dS )
z?Precision timing loop that maintains exact timing without driftr-   pausingN)seconds   g?g?r   gMbP?)r   r   r   r   r0   r    total_secondsintr!   r   r   _switch_to_pause_switch_to_transmitr   timesleepmax)	r"   total_cycle_timecurrent_timeelapsed_totalcurrent_cycletime_in_cycletarget_statenext_transition
sleep_times	            r   r2   z,TransmissionController._precision_cycle_loopr   s   -?  3	"#?,,L *D,AAPPRRM  1A ABBM),<<M t000$1! t111-  )  3 3#|338J3#y00T5E5W5W--////%77D<LPY<Y<Y002223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ~--"&"7)*-==@RR; ; ; #
 #'"7)+a/3CC; ; ; #
 *HO,=,==LLNNJC
3tZ$%6778888a
:&&& /##o55$:L5
5!!! /##o55$:L5e   3	" 3	" 3	" 3	" 3	"s   AC11C58C5c                 ,   d| _         |                     d| j         d           | j                                        r| j                            | j                   |                                  d| j        v r | j        d         dd           dS dS )z)Switch from transmitting to pausing staterH   zStarting pause cycle: sstatus_updatePAUSEDorangeN)r   r   r   r   r5   log_pause_startr>   r   r7   s    r   rM   z'TransmissionController._switch_to_pause   s    $HdoHHHIII --// 	>,,T_=== 	$$&&& d000/D/(CCCCC 10r   c                     d| _         |                     d           | j                                        r| j                                         |                                  dS )z)Switch from pausing to transmitting stater-   zResuming transmission cycleN)r   r   r   r5   log_pause_completer4   r7   s    r   rN   z*TransmissionController._switch_to_transmit   sg    ):;;; --// 	2//111 	%%'''''r   c                 &   | j                             d          | j                             d          | j                             d          d}| j                            | j        |           d| j         v r | j         d         dd           dS dS )	zStart actual GPIO transmissiononoff_indicatorduty_indicatorpolarity_indicatoronoffdutypolarityr\   TRANSMITTINGgreenN)r   getr   start_transmissionr   r"   indicator_callbackss     r   r4   z/TransmissionController._start_gpio_transmission   s     '++,=>>&**+;<<*../CDD
 
 	//0FH[\\\ d000/D/HHHHH 10r   c                     | j                             d          | j                             d          | j                             d          d}| j                            |           dS )zStop GPIO transmissionrc   rd   re   rf   N)r   rl   r   stop_transmissionrn   s     r   r>   z.TransmissionController._stop_gpio_transmission   sp     '++,=>>&**+;<<*../CDD
 
 	../BCCCCCr   c                     dS zILegacy method - kept for compatibility but not used with precision timingN r7   s    r   _start_pause_cyclez)TransmissionController._start_pause_cycle   	     	r   c                     dS rs   rt   r7   s    r   _resume_transmission_cyclez1TransmissionController._resume_transmission_cycle   rv   r   c                 X    |                                   |                     d           dS )z Clean up transmission controllerz"Transmission controller cleaned upN)rA   r   r7   s    r   cleanupzTransmissionController.cleanup   s/    $$&&&ABBBBBr   )N)__name__
__module____qualname____doc__r#   r%   r(   r+   r8   rA   rD   rF   r2   rM   rN   r4   r>   ru   rx   rz   rt   r   r   r   r      s!       ??   8Z Z Z/ / /
' ' '  4  4$ $ $
. . .
7" 7" 7"rD D D 
( 
( 
(I I I D D D  
  
C C C C Cr   r   )r   rO   r   r   r   rt   r   r   <module>r      sx         ( ( ( ( ( ( ( (lC lC lC lC lC lC lC lC lC lCr   