
    ٘hH                        d dl Z d dlZd dlmZ  G d d          Z G d d          ZddZdd	Zed
k    r e            Ze	                    ddd ej
                     ej
                     ej
                    ddd	  	        ZerIe                    d           e                    d           e                    d           e                    d           e                    d           e                    d           e                                 e                                 e                    dd           e                    dd           e                    dd           e                                  ed            ede                                             ede                                            dS  ed           dS dS )     N)datetimec                       e Zd ZdZddZd Zd Zd ZddZd	 Z	d
 Z
d dZd dZd Zd Zd Zd Zd Zd Zd Zd dZd dZd dZd Zd dZd Zd Zd Zd ZdS )!
DataLoggerzOMain application data logger for CSEM Triggerbox operations (NOT GPS positions)"/home/morepork/Documents/CSEM/logsc                     || _         d | _        d | _        d| _        t	          j                    | _        d | _        t          j	        | j         d           i | _
        d S )NFT)exist_ok)log_directorymain_log_filegps_log_path
is_logging	threadingRLocklog_lock
gps_readerosmakedirssession_infoselfr	   s     $/home/morepork/Documents/CSEM/log.py__init__zDataLogger.__init__   sa    *! !)) 	D&6666     c                     || _         dS )z;Set reference to GPS reader for accessing final coordinatesN)r   r   r   s     r   set_gps_readerzDataLogger.set_gps_reader   s    $r   c                     || _         dS )zLSet the GPS log file path (from GPSReader) - GPS logs are handled separatelyNr   r   paths     r   set_gps_log_pathzDataLogger.set_gps_log_path   s     r   c                     | j         S )z$Return the current GPS log file pathr   r   s    r   get_current_gps_log_filez#DataLogger.get_current_gps_log_file   s      r   Nc
                 |   | j         r|                                  |||||||||	t          j                    d
}
|t          j                    n|}d|                    d           d}t
          j                            | j        |          }	 t          |d          }n*# t          $ r}t          d|            Y d}~dS d}~ww xY w| j        5  |
| _        || _        d	| _         ddd           n# 1 swxY w Y   	 |                                  t          d
|            |                     dd           d	S # t          $ rs}t          d|            | j        5  d| _         | j        r)	 | j                                         n#  Y nxY wd| _        ddd           n# 1 swxY w Y   Y d}~dS d}~ww xY w)a  
        Start a new MAIN log file (application events, NOT GPS positions)
        
        Args:
            frequency: Transmission frequency in Hz
            transmit_time: Transmit duration in seconds
            pause_time: Pause duration in seconds
            rpi_time: Current RPI time
            gps_time: Current GPS time
            rtc_time: Current RTC time
            lat: GPS latitude
            lon: GPS longitude
            sats: Number of GPS satellites
        )
	frequencytransmit_time
pause_timerpi_timegps_timertc_timelatlonsats
start_timeN	main_log_z%Y%m%d_%H%M%Sz.txtwz,[LOG ERROR] Failed to create main log file: FTz[LOG] Started MAIN logging to: SESSION_STARTz Main application logging startedz$[LOG ERROR] Failed to write header: )r   stop_loggingr   utcnowstrftimer   r   joinr	   open	Exceptionprintr   r   r
   _write_header_log_event_immediateclose)r   r%   r&   r'   r(   r)   r*   r+   r,   r-   r   nowfilenamefilepathlog_filees                   r   start_loggingzDataLogger.start_logging"   s     ? 	  #*$   "/++
 
 $,#3hoBs||O<<BBB7<< 2H==	Hc**HH 	 	 	DDDEEE55555	
 ] 	# 	# ,D!)D"DO		# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#	   >H>>???%%o7YZZZ4 	 	 	<<<=== . ."'% .*002222)-D&. . . . . . . . . . . . . . . 55555	s~   B! !
C+CCC44C8;C8 <D> >
F;F6!F%1F
F%FF%F6%F)	)F6,F)	-F66F;c                    d}d}| j         5  | j        r| j        rd}| j        }d| _        d| _        ddd           n# 1 swxY w Y   |r|r	 |                     |           t	          j                                        d          }|                    | d           |                                 t          d           dS # t          $ r}t          d|            Y d}~dS d}~ww xY wdS dS )z0Stop logging and close the current main log fileNFT%Y-%m-%d %H:%M:%Sz6 UTC - SESSION_STOP: Main application logging stopped
z[LOG] Stopped main loggingz)[LOG ERROR] Error closing main log file: )r   r   r
   _write_final_gps_coordinatesr   r3   r4   writer;   r8   r7   )r   r?   was_logging	timestampr@   s        r   r2   zDataLogger.stop_loggingj   s    ] 	( 	( (4#5 ("-%)""'	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(  	G8 	G
G11(;;; %O--667JKK	)dddeee   344444 G G GE!EEFFFFFFFFFG	G 	G 	G 	Gs(   &>AAA6C 
C-C((C-c                 N   	 | j         rt          | j         d          rn| j         j        }t          j                                        d          }|                    d           |                    d           |                    d           |                    | d           |                    d|                    dd	           d
           |                    d|                    dd	           d
           |                    d|                    dd	           d
           |                    d          r2|                    d|d                             d           d           |                    d           dS t          j                                        d          }|                    | d           dS # t          $ rL}t          j                                        d          }|                    | d| d
           Y d}~dS d}~ww xY w)z1Write final GPS coordinates to log before closingcurrent_gps_datarC   z*
========================================
zFINAL GPS POSITION:
z)========================================
z UTC - FINAL_GPS_POSITION:
  Latitude: r+   N/A
  Longitude: r,     Satellites: r-   gps_datetimez  GPS Time: z UTC
z2 UTC - FINAL_GPS_POSITION: GPS data not available
z, UTC - ERROR retrieving final GPS position: N)	r   hasattrrI   r   r3   r4   rE   getr7   )r   r?   gps_datarG   r@   s        r   rD   z'DataLogger._write_final_gps_coordinates   s6   	\ b74?<N#O#O b?;$O--667JKK	56666777///)IIIJJJLhll5%.H.HLLLMMMMx||E5/I/IMMMNNNOVU0K0KOOOPPP<<// rNN#p(>2J2S2STg2h2h#p#p#pqqq/////$O--667JKK	)```aaaaa 	\ 	\ 	\ ))223FGGINNiZZUVZZZ[[[[[[[[[	\s   F
G >G 
H$AHH$ c                 4   | j         sdS | j                            d          r	 | j         rv| j        rot	          j                                        d          }| d| }|r|d| z  }|dz  }| j                            |           | j                                         n)# t          $ r}t          d|            Y d}~nd}~ww xY w| j                                         dS # | j                                         w xY wt          d	|            dS )
z
        Log an application event with timestamp to MAIN log (NOT GPS log)
        
        Args:
            event_type: Type of event ('COUNTDOWN', 'TRANSMIT_START', 'TRANSMIT_STOP', etc.)
            message: Additional message or data
        Ng?)timeoutrC    UTC - : rL   z'[LOG ERROR] Failed to write log entry: z5[LOG WARNING] Skipped log entry due to lock timeout: )r   r   acquirer
   r   r3   r4   rE   flushr7   r8   releaser   
event_typemessagerG   log_liner@   s         r   	log_eventzDataLogger.log_event   sf     	F =   -- 	X(? /t'9 / ( 1 1 : :;N O OI"+@@J@@H 3 NNN2$H&,,X666&,,... E E ECCCDDDDDDDDE %%'''''%%'''' V*VVWWWWWs0   A=B$ #C( $
C
.C C( C

C( (Dc                 Z   | j         r| j        sdS 	 t          j                                        d          }| d| }|r|d| z  }|dz  }| j                            |           | j                                         dS # t          $ r}t          d|            Y d}~dS d}~ww xY w)zHLog event immediately without timeout (use only when you know it's safe)NrC   rV   rW   rL   z1[LOG ERROR] Failed to write immediate log entry: )	r   r
   r   r3   r4   rE   rY   r7   r8   r[   s         r   r:   zDataLogger._log_event_immediate   s     	d&8 	F
	K ))223FGGI#88J88H +NNN*H$$X...$$&&&&& 	K 	K 	KIaIIJJJJJJJJJ	Ks   A/B 
B*B%%B*c                     d|v r|                      dd           dS |                    dd          }|                      d|           dS )z Log countdown events to MAIN logz00:00COUNTDOWN_COMPLETEzCountdown reached zerozCountdown: rS   	COUNTDOWNN)r_   replace)r   countdown_text	time_parts      r   log_countdownzDataLogger.log_countdown   sZ    n$$NN/1IJJJJJ '..}bAAINN;	22222r   c                 :    |                      dd| d           dS )z"Log transmission start to MAIN logTRANSMIT_STARTzStarted transmission at  HzNr_   )r   r%   s     r   log_transmission_startz!DataLogger.log_transmission_start   s)    ')RI)R)R)RSSSSSr   c                 2    |                      dd           dS )z!Log transmission stop to MAIN logTRANSMIT_STOPzStopped transmissionNrk   r"   s    r   log_transmission_stopz DataLogger.log_transmission_stop   s    (>?????r   c                 :    |                      dd| d           dS )zLog pause start to MAIN logPAUSE_STARTzStarted zs pauseNrk   )r   durations     r   log_pause_startzDataLogger.log_pause_start   s(    }&B&B&B&BCCCCCr   c                 2    |                      dd           dS )z Log pause completion to MAIN logPAUSE_COMPLETEzPause period endedNrk   r"   s    r   log_pause_completezDataLogger.log_pause_complete   s    ')=>>>>>r   c                 2    |                      dd           dS )zLog complete cycle to MAIN logCYCLE_COMPLETEzTransmission cycle completedNrk   r"   s    r   log_cycle_completezDataLogger.log_cycle_complete   s    ')GHHHHHr   c                 2    |                      dd           dS )zLog manual stop to MAIN logMANUAL_STOPzTransmission manually stoppedNrk   r"   s    r   log_manual_stopzDataLogger.log_manual_stop   s    }&EFFFFFr   c                 8    |                      d| |           dS )z&Log synchronization events to MAIN logSYNC_Nrk   r   r\   r]   s      r   log_sync_eventzDataLogger.log_sync_event   %    +z++W55555r   c                 8    |                      d| |           dS )z#Log GPIO-related events to MAIN logGPIO_Nrk   r   s      r   log_gpio_eventzDataLogger.log_gpio_event   r   r   c                 8    |                      d| |           dS )z%Log timing-related events to MAIN logTIMING_Nrk   r   s      r   log_timing_eventzDataLogger.log_timing_event   %    ---w77777r   c                 D    |                      dd|dd|dd           dS )z!Log frequency changes to MAIN logFREQUENCY_CHANGEzChanged from .3fz Hz to rj   Nrk   )r   old_freqnew_freqs      r   log_frequency_changezDataLogger.log_frequency_change   s8    )+a8+a+a+aPX+a+a+a+abbbbbr   c                 8    |                      d| |           dS )z#Log system-level events to MAIN logSYSTEM_Nrk   r   s      r   log_system_eventzDataLogger.log_system_event   r   r   c                     | j         S )z=Check if main logging is currently active (thread-safe check))r   r"   s    r   is_logging_activezDataLogger.is_logging_active  s
    r   c                     | j         5  | j        r| j        j        cddd           S 	 ddd           n# 1 swxY w Y   dS )z"Get the current main log file pathN)r   r
   namer"   s    r   get_current_log_filezDataLogger.get_current_log_file  s    ] 	/ 	/! /).	/ 	/ 	/ 	/ 	/ 	/ 	/ 	//	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ ts   599c                 v    | j         5  | j                                        cddd           S # 1 swxY w Y   dS )zGet current session informationN)r   r   copyr"   s    r   get_session_infozDataLogger.get_session_info  s    ] 	, 	,$))++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   .22c                 	   | j         r| j        sdS | j        }g }|                    d           |                    d           |                    d           |                    d|d                             d           d           |                    d           |                    d	           |                    d
           |                    d           |                    d           |d         r2|                    d|d                             d                      n|                    d           |d         r2|                    d|d                             d                      n|                    d           |d         r2|                    d|d                             d                      n|                    d           |                    d           |                    d           |                    d|d         r|d         dk    r|d         nd            |                    d|d         r|d         dk    r|d         nd            |                    d|d         r|d         dk    r|d         nd            |                    d           |                    d           |                    d|d          d!d"           |                    d#d$|d          z  d!d%           |                    d&|d'          d%           |                    d(|d)          d%           |                    d           |                    d*           |                    d+           |                    d,           |                    d-           |                    d.           |                    d           |                    d/           |                    d0| j         j                    | j        r|                    d1| j                    n|                    d2           |                    d           |                    d           |                    d3           |                    d           |                    d           |D ]}| j                             |d4z               | j                                          dS )5z3Write main log file header with session informationNz<============================================================z,MBARI CSEM TRIGGERBOX - MAIN APPLICATION LOGzLog created: r.   rC   z UTCrS   zMNOTE: This is the MAIN APPLICATION log for events, timing, and system status.z;GPS position data is logged separately in the GPS log file.zTIME SYNCHRONIZATION:r(   z  RPI Time (UTC): z  RPI Time (UTC): Not availabler)   z  GPS Time (UTC): z  GPS Time (UTC): Not availabler*   z  RTC Time (UTC): z  RTC Time (UTC): Not availablez GPS POSITION (at session start):rJ   r+   rK   zNot availablerM   r,   rN   r-   zTRANSMISSION SETTINGS:z  Frequency: r%   r   rj   z
  Period:       ?z secondsz  Transmit Time: r&   z  Pause Time: r'   zGPIO CONFIGURATION:z6  TX Status: GPIO 13 (Pin 33) - HIGH when transmittingz8  Duty Signal: GPIO 6 (Pin 31) - toggles at 2x frequencyz:  Polarity Signal: GPIO 26 (Pin 37) - toggles at frequencyz8  PPS Input: GPIO 17 (Pin 11) - 1 pulse per second inputz
LOG FILES:z  Main Log: z  GPS Log: z1  GPS Log: Will be created when GPS reader startszAPPLICATION EVENT LOG:rL   )r
   r   appendr4   r   r   rE   rY   )r   infoheaderlines       r   r9   zDataLogger._write_header  s!    ! 	): 	F hDEEEh\d<&8&A&ABU&V&V\\\]]]befffSTTTb 	-...
 	=MM_tJ/?/H/HI\/]/]__````MM;<<<
 	=MM_tJ/?/H/HI\/]/]__````MM;<<<
 	=MM_tJ/?/H/HI\/]/]__````MM;<<<b 	8999oDK%mDKSXDXDXT%[[^mooppppT%[&nT%[TYEYEYd5kk_nppqqqttF|'rVX]H]H]tF||crttuuub 	.///@d;&7@@@@AAAF3tK'8#8FFFFGGGI$*?IIIJJJCtL'9CCCDDDb 	+,,,NOOOPQQQRSSSPQQQb 	l###>T%7%<>>??? 	OMM;(9;;<<<<MMMNNNbh.///hb  	2 	2D$$TD[1111  """""r   r   )NNNNNNrS   )__name__
__module____qualname____doc__r   r   r    r#   rA   r2   rD   r_   r:   rg   rl   ro   rs   rv   ry   r|   r   r   r   r   r   r   r   r   r9    r   r   r   r      s       YY   % % %! ! !! ! !F F F FPG G G6\ \ \0X X X X@K K K K"3 3 3T T T@ @ @D D D? ? ?I I IG G G6 6 6 66 6 6 68 8 8 8c c c8 8 8 8    , , ,
M# M# M# M# M#r   r   c                   F    e Zd ZdZddZd Zd ZddZd Zd	 Z	d
 Z
d ZdS )
LogManagerz=Manager class for handling both main and GPS log coordinationr   c                 <    t          |          | _        || _        d S )N)r   data_loggerr	   r   s     r   r   zLogManager.__init__f  s     %m44*r   c                 &     | j         j        di |S )z5Start main application logging for a complete sessionr   )r   rA   )r   session_paramss     r   start_session_loggingz LogManager.start_session_loggingj  s    -t-?????r   c                 8    | j                                          dS )zStop main application loggingN)r   r2   r"   s    r   stop_session_loggingzLogManager.stop_session_loggingn  s    %%'''''r   rS   c                 B    | j                             d| |           dS )z(Log application-level events to main logAPP_N)r   r_   )r   r\   detailss      r   log_application_eventz LogManager.log_application_eventr  s*    ""#6*#6#6@@@@@r   c                 :    | j                             |           dS )z,Set GPS log file path (called by GPS reader)N)r   r    r   s     r   r    zLogManager.set_gps_log_pathv  s    ))$/////r   c                 :    | j                             |           dS )z.Set GPS reader reference for final coordinatesN)r   r   r   s     r   r   zLogManager.set_gps_readerz  s    ''
33333r   c                     | j                                         | j                                         | j                                         | j                                         dS )z$Get status of all logging activities)main_logging_activer
   gps_log_filer   )r   r   r   r#   r   r"   s    r   get_log_statuszLogManager.get_log_status~  s[     $(#3#E#E#G#G!-BBDD ,EEGG ,==??	
 
 	
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 sizes of all log filesr   )main_log_kb
gps_log_kbi   r   r   )r   r   r   r   existsgetsizer#   )r   sizesmain_loggps_logs       r   get_log_sizeszLogManager.get_log_sizes  s     !33#88:: 	Dx00 	D#%7??8#<#<t#CE- ";;== 	Brw~~g.. 	B"$'//'":":T"AE,r   Nr   r   )r   r   r   r   r   r   r   r   r    r   r   r   r   r   r   r   r   c  s        GG+ + + +@ @ @( ( (A A A A0 0 04 4 4
 
 
    r   r   r   c                      t          |           S )z Create a new DataLogger instance)r   r	   s    r   create_loggerr         m$$$r   c                      t          |           S )z Create a new LogManager instance)r   r   s    r   create_log_managerr     r   r   __main__g      ?<      z
36.12345 Nz121.67890 W8)	r%   r&   r'   r(   r)   r*   r+   r,   r-   zCountdown: 01:30zCountdown: 01:00zCountdown: 00:30zCountdown: 00:00SUCCESSzRTC synchronized to GPS timeSTARTzGPIO pins initializedr   zTest completed successfully!z
Main log: z	GPS log: zFailed to start logging!r   )r   r   r   r   r   r   r   r   loggerrA   r3   successrg   rl   rs   rv   ro   r   r   r   r2   r8   r   r#   r   r   r   <module>r      s   				          [# [# [# [# [# [# [# [#|
0 0 0 0 0 0 0 0h% % % %% % % % zZ\\F "" "" "" "" # 
 
G  */000/000/000/000%%c***r"""!!###$$&&&i)GHHHg'>???##C--- 	,---:66688::;;;=&99;;==>>>>>()))))M r   