
    kۘh@                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  G d d          ZdS )    N)datetime)DS3231)	GPSReader)	RTCReader)GPIOController)TimingController)SyncController)FrequencyController)TransmissionController)
DataLoggerc                       e Zd ZdZddZd Zd Zd Zd 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 Zd Zd!dZd!dZdS )"ApplicationControllerzQMain application controller that coordinates all subsystems with separate loggingN"/home/morepork/Documents/CSEM/logsc                     |pi | _         || _        t                      | _        t	          j                    | _        d| _        dddd| _        | 	                                 d | _
        d | _        d S )NFN/Alatlonsats)gui_callbackslog_directoryr   rtcqueueQueue	rtc_queueinitializedcurrent_gps_data_init_controllers
gps_reader
rtc_reader)selfr   r   s      7/home/morepork/Documents/CSEM/application_controller.py__init__zApplicationController.__init__   s}    *0b* 88 ! !
 !
 	        c                 <   t          | j                  | _        t          | j                  | _        t          | j        | j                  | _	        t          d| j                  | _        t          | j        | j        | j                  | _        d| _        dS )z!Initialize all controller objects)status_callback)r   update_callbackg      ?)initial_frequencyr'   )gpio_controllerdata_loggerr&   N)r   r   r*   r   _gpio_status_callbackr)   r   r   _time_update_callbacktiming_controllerr
   _frequency_update_callbackfrequency_controllerr   _transmission_status_callbacktransmission_controllersync_controllerr!   s    r"   r   z'ApplicationController._init_controllers+   s     &d&899  . 6 
  
  

 "2 6"
 "
 "
 %8! ;%
 %
 %
! (> 0( >(
 (
 (
$  $r$   c                    | j         rdS 	 |                                  | j                                         | j                            | j                   d| _         |                     d           | j        r| j        	                    dd           dS # t          $ r]}d| }|                     |           | j        r1	 | j        	                    dt          |                     n#  Y nxY wY d}~dS d}~ww xY w)z,Initialize the application and start threadsTz$Application initialized successfullyINIT_SUCCESSzFailed to initialize: INIT_FAILURENF)r   _start_threadsr-   start_synchronized_timingr)   start_pps_monitoring_pps_update_callback_status_callbackr*   log_system_event	Exceptionstr)r!   e	error_msgs      r"   
initializez ApplicationController.initializeK   s5    	4	!!! "<<>>>  55d6OPPP#D!!"HIII  j 11.Bhiii4 	 	 	444I!!),,,  $55nc!ffMMMMD55555	s0   B
B 
C>!!C9(C,+C9,C0.C99C>c                    t          dd| j        | j        | j        | j                  | _        | j                                         | j                            | j                   t          | j
        | j                  | _        | j                                         t          | j
        | j        | j                  | _        dS )z Start GPS and RTC reader threadsz/dev/ttyAMA0i  )r   )r   r   r&   N)r   _gps_data_callbackr;   _sync_callbackr   r   startr*   set_gps_readerr   r   _rtc_queue_callbackr    r	   _sync_status_callbackr2   r3   s    r"   r7   z$ApplicationController._start_threadsp   s     $D#!,
 
 
 	''888 $DHd.FGG  . 6 
  
  
r$   c                     | j                             |           | j        | j        _        | j                            | j                    dS )zRegister GUI callback functionsN)r   updater.   r/   r'   r1   register_gui_callbacks)r!   	callbackss     r"   rK   z,ApplicationController.register_gui_callbacks   sI    !!),,, 594S!1$;;D<NOOOOOr$   c                    | j         sdS | j                                        }| j                            | j                                        | j        j        | j        j	        |
                    d          |
                    d          |
                    d          | j        
                    d          | j        
                    d          | j        
                    d          	  	        }|r| j                                        }| j                            |           d	| j        v r | j        d	         d
           | j                                        }|                     dt$          j                            |           d|rt$          j                            |          nd            | j                            | j                                                   | j                            | j        | j        j                  }|rP| j                                        r7| j                            dd| j                                        dd           |S )z)Start countdown and transmission sequenceFrpigpsr   r   r   r   )		frequencytransmit_time
pause_timerpi_timegps_timertc_timer   r   r   recording_indicatorTzStarted logging - Main: z, GPS: Separate)countdown_callbacktransmission_start_callbackCOUNTDOWN_STARTzCountdown started for z.3fz Hz transmission)r   r-   get_cached_timesr*   start_loggingr/   get_frequencyr1   rQ   rR   getr   r   get_gps_log_fileset_gps_log_pathr   get_current_log_filer;   ospathbasenameset_frequencystart_countdown_countdown_callbackstart_transmission_cycleis_logging_active	log_event)r!   cached_timeslog_successgps_log_pathmain_log_filesuccesss         r"    start_countdown_and_transmissionz6ApplicationController.start_countdown_and_transmission   s    	5 ->>@@&44/==??6D3>!%%e,,!%%e,,!%%e,,%))%00%))%00&**622 5 

 

  
	g?;;==L--l;;; %(:::9"#89$??? ,AACCM!!  #fRW=M=Mm=\=\  #f  #f  HT  fdegeleueu  wC  fD  fD  fD  Zd  #f  #f  g  g  g 	$2243L3Z3Z3\3\]]] (88#7(,(D(] 9 
 

  	Tt'99;; 	T&&'8  ;SSWSlSzSzS|S|  ;S  ;S  ;S  ;S  T  T  Tr$   c                    | j         sdS | j                                        r| j                            dd           | j                                         | j                                         | j                                        r:| j                                         d| j	        v r | j	        d         d           dS dS dS )zStop transmission and loggingNTRANSMISSION_STOP_REQUESTEDz User requested transmission stoprV   F)
r   r*   ri   rj   r-   stop_countdownr1   stop_transmission_cyclestop_loggingr   r3   s    r"   stop_transmissionz'ApplicationController.stop_transmission   s     	F --// 	j&&'DFhiii 	--/// 	$<<>>> --// 	A))+++$(:::9"#89%@@@@@	A 	A::r$   c                     | j         sdS | j                                        r| j                            dd           | j                             ||          S )z#Initiate GPS to RTC synchronizationFATTEMPTzGPS to RTC sync requested)success_callbackerror_callback)r2   r*   ri   log_sync_eventsync_rtc_time)r!   ry   rz   s      r"   r|   z#ApplicationController.sync_rtc_time   sl    # 	5 --// 	T++I7RSSS#11-) 2 
 
 	
r$   c                     | j         j        }|| j         _        | j                                        r*||k    r&| j                            dd| d| d           dS dS dS )zUpdate transmit time settingPARAM_CHANGEzTransmit time changed from s to sN)r1   rQ   r*   ri   rj   )r!   rQ   old_times      r"   update_transmit_timez*ApplicationController.update_transmit_time   s    /=5B$2 --// 	vH4M4M&&~7tU]7t7tdq7t7t7tuuuuu	v 	v4M4Mr$   c                     | j         j        }|| j         _        | j                                        r*||k    r&| j                            dd| d| d           dS dS dS )zUpdate pause time settingr~   zPause time changed from r   r   N)r1   rR   r*   ri   rj   )r!   rR   r   s      r"   update_pause_timez'ApplicationController.update_pause_time   s    /:2<$/ --// 	pH
4J4J&&~7nRZ7n7nak7n7n7nooooo	p 	p4J4Jr$   c                     | j         S )z*Get frequency controller for direct access)r/   r3   s    r"   get_frequency_controllerz.ApplicationController.get_frequency_controller   s    ((r$   c                 F    | j         sdS | j                                        S )zGet current transmission statenot_initialized)r   r1   get_cycle_stater3   s    r"   get_transmission_statez,ApplicationController.get_transmission_state   s(     	%$$+;;===r$   c                 B    | j         o| j                                         S )zCheck if sync is in progress)r2   is_sync_in_progressr3   s    r"   r   z)ApplicationController.is_sync_in_progress   s    #R(<(P(P(R(RRr$   c                 h    | j                                         | j                                         dS )zGet current log file paths)main_loggps_log)r*   ra   get_current_gps_log_filer3   s    r"   get_log_filesz#ApplicationController.get_log_files   s7     (==??'@@BB
 
 	
r$   c                    ddd}| j                                         }|rDt          j                            |          r%t          j                            |          dz  |d<   | j                                         }|rDt          j                            |          r%t          j                            |          dz  |d<   |S )zGet current log file sizesr   )main_log_kb
gps_log_kbi   r   r   )r*   ra   rb   rc   existsgetsizer   )r!   sizesr   r   s       r"   get_log_sizesz#ApplicationController.get_log_sizes  s     !33#88:: 	Dx00 	D#%7??8#<#<t#CE- ";;== 	Brw~~g.. 	B"$'//'":":T"AE,r$   c                 j   | j         sdS | j                                        r| j                            dd           d| _         |                                  | j                                         | j                                         | j	                                         | j                                        r4| j                            dd           | j        
                                 | j        r| j                                         | j        r| j                                         dS dS )zClean up all resourcesNCLEANUP_STARTzApplication cleanup initiatedFCLEANUP_COMPLETEzApplication cleanup completed)r   r*   ri   r<   rv   r-   stop_synchronized_timingr)   cleanupr1   ru   r   stopr    r3   s    r"   r   zApplicationController.cleanup  s:    	F --// 	`--o?^___  	    	77999$$&&&$,,... --// 	,--.@Babbb))+++ ? 	#O  """? 	#O  """""	# 	#r$   c                 j    d| j         v r | j         d         |d           t          d|            dS )zStatus update callbackstatus_updateNz[APP] )r   printr!   msgs     r"   r;   z&ApplicationController._status_callback4  sD    d000/D/T:::nsnnr$   c                     | j                                         rGd|                                v sd|                                v r| j                             d|           t	          d|            dS )zGPIO status callbackr   errorSTATUSz[GPIO] N)r*   ri   lowerlog_gpio_eventr   r   s     r"   r+   z+ApplicationController._gpio_status_callback:  sx     --// 	;]ciikk5Q5QU\`c`i`i`k`kUkUk++Hc:::ooor$   c                     | j                                         r| j                             d|           t          d|            dS )zTransmission status callbackTRANSMISSION_STATUSz[TX] N)r*   ri   rj   r   r   s     r"   r0   z3ApplicationController._transmission_status_callbackA  sP     --// 	C&&'<cBBBmcmmr$   c                 H    d| j         v r | j         d         |           dS dS )zTime update callbacktime_updateNr   )r!   rk   s     r"   r,   z+ApplicationController._time_update_callbackH  s6    D...-D}-l;;;;; /.r$   c                 "   t          | d          rT| j                                        r;t          || j        z
            dk    r | j                            | j        |           || _        d| j        v r | j        d         |||           dS dS )zFrequency update callback_last_logged_frequencygMbP?frequency_updateN)hasattrr*   ri   absr   log_frequency_changer   )r!   rP   perioddecimal_place_names       r"   r.   z0ApplicationController._frequency_update_callbackM  s     4122 	^1133 ^IHc<c8d8dgl8l8l 55d6QS\]]]&/#!3332D129fFXYYYYY 43r$   c                     | j                                         r| j                             |           d| j        v r | j        d         |           dS dS )zCountdown update callbackcountdown_updateN)r*   ri   log_countdownr   )r!   countdown_texts     r"   rg   z)ApplicationController._countdown_callbackX  sg     --// 	;**>:::!3332D12>BBBBB 43r$   c                 H    d| j         v r | j         d         |           dS dS )zPPS indicator update callbackpps_indicatorNr   )r!   	pps_states     r"   r:   z*ApplicationController._pps_update_callbacka  s6    d000/D/	::::: 10r$   c                    |d         |d         |d         d| _         | j                            |d                    	 |d         dk    rt          |d                   nd}n# t          t
          f$ r d}Y nw xY w| j        r!| j                            |d         |           d| j        v r | j        d         |           | 	                                s"d	| j        v r | j        d	         d
d           dS dS dS )zGPS data update callbackr   r   r   r   gps_datetimer   r   
gps_updater   zGPS OKgreenN)
r   r-   update_gps_timeint
ValueError	TypeErrorr2   update_gps_datar   r   )r!   datagps_satss      r"   rC   z(ApplicationController._gps_data_callbackf  sE    ;;L!
 !
 	..tN/CDDD	,0LE,A,As4<(((qHHI& 	 	 	HHH	  	Q 00n1ExPPP 4---,D|,T222 '')) 	G$"4443"?3HgFFFFF	G 	G44s   #A# #A98A9c                     | j         re| j                                        r0| j                            dd|                                            | j                             |           dS dS )zHandle GPS sync callbackBOUNDARY_DETECTEDz GPS second boundary detected at N)r2   r*   ri   r{   	isoformathandle_sync)r!   	sync_times     r"   rD   z$ApplicationController._sync_callback  s     	81133 A //0CEhqh{h{h}h}EE  A  A  A ,,Y77777	8 	8r$   c                    | j                                         rd|                                v r| j                             d|           ncd|                                v sd|                                v r| j                             d|           n| j                             d|           d| j        v r | j        d         ||           dS dS )	zSync status update callbackro   SUCCESSr   failERRORr   sync_status_updateN)r*   ri   r   r{   r   )r!   r   colors      r"   rH   z+ApplicationController._sync_status_callback  s     --// 	?CIIKK'' //	3????CIIKK''6SYY[[+@+@ //==== //#>>>4#5554D34S%@@@@@ 65r$   c                     |rZd| }t          d|            | j                                        r,| j                            dt	          |                     dS dS dS )zRTC queue callbackzRTC ERROR: z[RTC ERROR] 	RTC_ERRORN)r   r*   ri   r<   r>   )r!   rU   r   r@   s       r"   rG   z)ApplicationController._rtc_queue_callback  s     	K-e--I((()))1133 K 11+s5zzJJJJJ	K 	KK Kr$   )Nr   )NN)N)__name__
__module____qualname____doc__r#   r   rA   r7   rK   rp   rv   r|   r   r   r   r   r   r   r   r   r;   r+   r0   r,   r.   rg   r:   rC   rD   rH   rG    r$   r"   r   r      s       [[   2$ $ $@# # #J
 
 
0P P P+ + +ZA A A*
 
 
 
v v vp p p) ) )> > >S S S
 
 
  # # #>      < < <
	Z 	Z 	ZC C C; ; ;
G G G<8 8 8A A A AK K K K K Kr$   r   )r   rb   r   r   r   r   r   r    r   r)   r   r-   r   r2   r	   r/   r
   r1   r   logr   r   r   r$   r"   <module>r      s    				                                     * * * * * * . . . . . . * * * * * * 4 4 4 4 4 4 : : : : : :      SK SK SK SK SK SK SK SK SK SKr$   