
    ٘h&                     d    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  G d de j                  ZdS )    N)datetime	timedeltac                   h     e Zd ZdZd f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 xZS )	GPSReaderzVGPS reader thread that handles NMEA data and provides GPS timing with separate logging"/home/morepork/Documents/CSEM/logsc                 n   t                                                       d| _        d| _        || _        || _        || _        || _        t          j	        | j        d           d| _
        d| _        d| _        t          j                    | _        d | _        d | _        d | _        d dddd| _        d S )	Nz/dev/ttyAMA0i  T)exist_okr   FN/A)gps_datetimelatlonsats)super__init__serial_port	baud_ratedata_callbackstatus_callbacksync_callbacklog_directoryosmakedirsrunninglast_data_timesync_requested	threadingLock	sync_locklast_gps_secondgps_log_path
gps_log_fpcurrent_gps_data)selfr   r   r   r   r   r   	__class__s          +/home/morepork/Documents/CSEM/gps_reader.pyr   zGPSReader.__init__   s    )*.** 	D&6666  $"))# ! !	!
 !
    c                    t          j                                        d          }t          j                            | j        d| d          | _        	 t          | j        d          | _	        | j	        
                    d           | j	        
                    d           | j	        
                    d           | j	        
                    dt          j                                        d           d	           | j	        
                    d
| j         d           | j	        
                    d| j         d           | j	        
                    d           | j	        
                    d           | j	        
                    d           | j	        
                    d           | j	        
                    d           | j	        
                    d           | j	        
                    d           | j	                                         |                     d| j                    dS # t          $ r*}|                     d|            d| _	        Y d}~dS d}~ww xY w)z+Start GPS position logging to separate filez%Y%m%d_%H%M%Sgps_log_z.txtwz=============================================================
z)MBARI CSEM TRIGGERBOX - GPS POSITION LOG
zLog created: %Y-%m-%d %H:%M:%Sz UTC
zSerial port: 
zBaud rate: z
GPS Configuration:
z)  - Position updates logged every second
zG  - Format: ISO_DateTime, Latitude, Longitude, Satellites, Fix_Quality
z  - All times in UTC
z>
============================================================
zGPS POSITION DATA:
zGPS logging started: zFailed to create GPS log: N)r   utcnowstrftimer   pathjoinr   r    openr!   writer   r   flushr   	Exception)r#   	timestampes      r%   start_gps_logzGPSReader.start_gps_log,   sM   O%%..??	GLL);=W	=W=W=WXX	#"4#4c::DO O!!/222O!!"NOOOO!!/222O!!"i(/2C2C2L2LM`2a2a"i"i"ijjjO!!"F$2B"F"F"FGGGO!!"B"B"B"BCCCO!!":;;;O!!"NOOOO!!"lmmmO!!":;;;O!!"8999O!!"8999O!!/222O!!###  !L9J!L!LMMMMM 	# 	# 	#  !Aa!A!ABBB"DOOOOOOO	#s   GH4 4
I(>I##I(c                    | j         r	 | j                             dt          j                                        d           d           | j                                          |                     d| j                    n/# t          $ r"}|                     d|            Y d}~nd}~ww xY wd| _         dS # d| _         w xY wdS )zStop GPS position loggingr+   r*   z UTC - GPS logging stopped
zGPS log closed: zError closing GPS log: N)	r!   r1   r   r,   r-   closer   r    r3   )r#   r5   s     r%   stop_gps_logzGPSReader.stop_gps_logH   s    ? 	''%%&x8?+<+<+E+EFY+Z+Z&x&x&xyyy%%'''$$%K8I%K%KLLLL D D D$$%Bq%B%BCCCCCCCCD #'$&&&&	' 	's0   A8B B: 
B.B)$B: )B..B: :	Cc                     | j         S )zGet current GPS log file path)r    r#   s    r%   get_gps_log_filezGPSReader.get_gps_log_fileT   s      r&    c                 X   | j         sdS 	 t          j                                        d          }| d| }|r|d| z  }|dz  }| j                             |           | j                                          dS # t          $ r#}|                     d|            Y d}~dS d}~ww xY w)z'Log GPS-specific events to GPS log fileNr*   z UTC - GPS_z: r+   GPS log write error: )r!   r   r,   r-   r1   r2   r3   r   )r#   
event_typemessager4   log_liner5   s         r%   log_gps_eventzGPSReader.log_gps_eventX   s     	F
	> ))223FGGI#<<
<<H +NNN*HO!!(+++O!!##### 	> 	> 	>  !<!<!<=========	>s   A/A< <
B)B$$B)c                     | j         5  | j        s9d| _        d| _        |                     d           |                     dd           ddd           dS # 1 swxY w Y   dS )z7Request synchronization on the next GPS second boundaryTNz"Waiting for GPS second boundary...SYNC_REQUESTz+Sync requested, waiting for second boundary)r   r   r   r   rC   r;   s    r%   request_synczGPSReader.request_synci   s    ^ 	b 	b& b&*#'+$$$%IJJJ"">3`aaa	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	bs   AAAAc                     |                                   |                     dd| j         d| j         d           	 |                     d           t          j        | j        | j        d          5 }|                     d| j         d| j         d	           |                     d
d| j                    | j        r|                                	                    dd          
                                }|r.t          j                    | _        |                     |           n4t          j                    | j        z
  dk    r|                     d           | j        ddd           n# 1 swxY w Y   n# t
          j        $ rG}d| }|                     |           |                     dt          |                     Y d}~nWd}~wt           $ rG}d| }|                     |           |                     dt          |                     Y d}~nd}~ww xY w|                     dd           |                                  dS # |                     dd           |                                  w xY w)zMain GPS reader loopCONNECTION_STARTzConnecting to z at z baudzConnecting to GPS...   )timeoutzConnected to z baud.CONNECTION_SUCCESSasciireplace)errors   z*Connected, but no valid GPS data received.NzSerial Error: CONNECTION_ERRORzGPS Reader Error: READER_ERRORCONNECTION_STOPzGPS reader stopping)r6   rC   r   r   r   serialSerialr   readlinedecodestriptimer   _process_nmea_lineSerialExceptionstrr3   r9   )r#   serliner5   	error_msgs        r%   runzGPSReader.runr   s   -/k@P/k/kVZVd/k/k/klll	   !7888t/KKK 
[s$$%aT5E%a%a4>%a%a%abbb""#79[IY9[9[\\\l [<<>>000KKQQSSD [.2ikk+//5555t'::Q>>,,-YZZZ l [	
[ 
[ 
[ 
[ 
[ 
[ 
[ 
[ 
[ 
[ 
[ 
[ 
[ 
[ 
[ % 	; 	; 	;,,,I  +++13q66:::::::: 	7 	7 	70Q00I  +++~s1vv66666666	7
 02GHHH 02GHHHsf   6E= 3C2E1%E= 1E55E= 8E59E= <I =H"=G	I H"=HI H""I ,I=c                    	 t          j        |          }t          |t           j        j        j                  r|                     |           n9t          |t           j        j        j                  r|                     |           | 	                    | j
                                                   dS # t           j        $ r Y dS w xY w)zProcess a single NMEA sentenceN)pynmea2parse
isinstancetypestalkerRMC_process_rmc_messageGGA_process_gga_messager   r"   copy
ParseError)r#   r]   msgs      r%   rY   zGPSReader._process_nmea_line   s    	-%%C#w}3788 /))#....C!5!9:: /))#... t499;;<<<<<! 	 	 	DD	s   B3B7 7C
	C
c           
      6   |j         dk    rot          j        |j        |j                  }|| j        d<   |j        r|j        dd|j         nd| j        d<   |j        r|j        dd|j	         nd| j        d<   | j
        r	 | j        d         dk    r| j        d         nd}| j        d         dk    r| j        d         nd}| j        d	         dk    r| j        d	         nd
}| j
                            |                                 d| d| d| d           | j
                                         n/# t          $ r"}|                     d|            Y d}~nd}~ww xY w|                     |           dS | j
        r	 t          j                                                    }| j
                            | d|j          d           | j
                                         dS # t          $ r#}|                     d|            Y d}~dS d}~ww xY wdS )z)Process RMC (Recommended Minimum) messageAr   z.5f r
   r   r   zNo Fixr   0z+00:00, z, z sats, Valid Fix
r?   Nz4+00:00, No Fix, No Fix, 0 sats, Invalid Fix Status: r+   )statusr   combine	datestampr4   r"   latitudelat_dir	longitudelon_dirr!   r1   	isoformatr2   r3   r   _check_sync_boundaryr,   )r#   rl   gps_dtlat_strlon_strsats_strr5   r4   s           r%   rg   zGPSReader._process_rmc_message   s   :%cmS]CCF4:D!.1RUR^+icl+N+N+N+N+N+NdiD!%(SVS`+kcm+O+O+O#++O+O+OfkD!%(  
F	F>B>STY>Z^c>c>cd3E::iqG>B>STY>Z^c>c>cd3E::iqG@D@UV\@]af@f@ft4V<<loHO))V-=-=-?-?*{*{*{*{T[*{*{_g*{*{*{|||O))++++  F F F(()D)D)DEEEEEEEEF %%f-----  FF ( 1 1 ; ; = =IO))Y*z*zlolv*z*z*z{{{O))+++++  F F F(()D)D)DEEEEEEEEEFF Fs2   B1D6 6
E" EE"A#G) )
H3HHc                 P    |j         rt          |j                   | j        d<   dS dS )z8Process GGA (Global Positioning System Fix Data) messager   N)num_satsr[   r"   )r#   rl   s     r%   ri   zGPSReader._process_gga_message   s3    < 	>,/,=,=D!&)))	> 	>r&   c                 r   |j         }| j        5  | j        r| j        {|| j        k    rp|t	          d          z   }|                    d          }|                     dd|                                            |                     |           d| _        ddd           n# 1 swxY w Y   || _        dS )	z1Check for GPS second boundary for synchronizationNrI   )secondsr   )microsecondSYNC_BOUNDARYz%Second boundary detected, syncing to F)	secondr   r   r   r   rM   rC   rx   r   )r#   rz   current_second	sync_times       r%   ry   zGPSReader._check_sync_boundary   s   ^ 	, 	,# ,$0$"666 #Yq%9%9%99	%--!-<<	""?4s\e\o\o\q\q4s4sttt""9---&+#	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,  .s   B
B%%B),B)c                     d| _         dS )zStop the GPS reader threadFN)r   r;   s    r%   stopzGPSReader.stop   s    r&   )r   )r=   )__name__
__module____qualname____doc__r   r6   r9   r<   rC   rF   r_   rY   rg   ri   ry   r   __classcell__)r$   s   @r%   r   r      s        ``
 
 
 
 
 
B# # #8
' 
' 
'! ! !> > > >"b b b     >   F F FB> > >. . .(      r&   r   )	r   rS   rX   ra   r   r   r   Threadr    r&   r%   <module>r      s           				 ( ( ( ( ( ( ( (V V V V V	  V V V V Vr&   