
    ugJ5                     n   d Z ddlZddlZddlZddlZddlZddlZddlZ G d de	          Z
edk    rej        d         Z eej        d                   Zej        d         Z e
eee	          Z	 e                                 e                                 dS # e                                 w xY wdS )
zDStream beast raw data from a TCP server, convert to mode-s messages.    Nc                   P     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
dd
Z xZS )	TcpClientc                    t          t          |                                            || _        || _        g | _        d | _        || _        | j        dvr#t          d           t          j
        d           d | _        d| _        d | _        d S )N)rawbeastskysensez.datatype must be either raw, beast or skysense   F)superr   __init__hostportbuffersocketdatatypeprintos_exitraw_pipe_in	stop_flagexception_queue)selfr   r   r   	__class__s       >/import/home/andy/PROGRAMMING/ModeS/amModeS/extra/tcpclient.pyr   zTcpClient.__init__   s    i'')))		 = <<<BCCCHQKKK#    c                 X   t          j                                        t           j                  | _        | j                            t           j        d           | j                            t           j        d           | j                            d| j        d| j	                   d S )Nr   i'  ztcp://:)
zmqContextr   STREAM
setsockoptLINGERRCVTIMEOconnectr   r   r   s    r   r#   zTcpClient.connect   s    kmm**3:66sz1---s|U333TYYY		BCCCCCr   c                 8    | j                                          d S )N)r   closer$   s    r   stopzTcpClient.stop#   s    r   c                 b   g }d}d| _         | j        D ]}|dk    r1d}t          j                    }|                    | j         |g           |dk    r	d}d| _         |sJd|cxk    rdk    s!n d|cxk    rd	k    sn d
|cxk    rdk    rn x| j         t	          |          z   | _         g | _        |S )z Read raw ADS-B data type.

        String strats with "*" and ends with ";". For example:
            *5d484ba898f8c6;
            *8d400cd5990d7e9a10043e5e6da0;
            *a0001498be800030aa0000c7a75f;
        F ;   T*   0   9   A   F   a   f   )current_msgr   timeappendchr)r   messagesmsg_stopbtss        r   read_raw_bufferzTcpClient.read_raw_buffer&   s      
	= 
	=ABwwY[[!12 6777Bww #%  =2====b====B!MMMMrMMMMR1^^^^PS^^^^^#'#3c!ff#< r   c                 h   g }g }d}|t          | j                  k     r | j        ||dz            ddgk    r|                    d           |dz  }n|t          | j                  dz
  k    r'| j        |         dk    r|                    d           n| j        |         dk    r\|t          | j                  dz
  k    r|                    d           nKt          |          dk    r|                    |           g }n |                    | j        |                    |dz  }|t          | j                  k      t          |          dk    rlg }t          |          D ]N\  }}|dk    r.|t          |          dz
  k     r|                    ||g           9|                    |           Odg|z   | _        ng | _        g }|D ]}t          j                    }|d         }	|	dk    r(d                    d |dd	         D                       }n/|	d
k    r(d                    d |dd         D                       }nzt          |          dvrt          j        |          }
|
dv rt          |          dk    r|
dv rt          |          dk    r|                    ||g           |S )  Handle mode-s beast data type.

        <esc> "1" : 6 byte MLAT timestamp, 1 byte signal level,
            2 byte Mode-AC
        <esc> "2" : 6 byte MLAT timestamp, 1 byte signal level,
            7 byte Mode-S short frame
        <esc> "3" : 6 byte MLAT timestamp, 1 byte signal level,
            14 byte Mode-S long frame
        <esc> "4" : 6 byte MLAT timestamp, status data, DIP switch
            configuration settings (not on Mode-S Beast classic)
        <esc><esc>: true 0x1a
        <esc> is 0x1a, and "1", "2" and "3" are 0x31, 0x32 and 0x33

        timestamp:
        wiki.modesbeast.com/Radarcape:Firmware_Versions#The_GPS_timestamp
        r         r	   2   r)   c              3       K   | ]	}d |z  V  
dS z%02XN .0is     r   	<genexpr>z.TcpClient.read_beast_buffer.<locals>.<genexpr>   &      ;;Qfqj;;;;;;r         3   c              3       K   | ]	}d |z  V  
dS rA   rB   rC   s     r   rF   z.TcpClient.read_beast_buffer.<locals>.<genexpr>   rG   r            r            rN                        rO   )	lenr   r4   	enumerateextendr3   joinpmsdf)r   messages_mlatmsgrE   remindermr6   mmr9   msgtypera   s              r   read_beast_bufferzTcpClient.read_beast_bufferB   s   " 
 #dk""""{1q1u9%$55

4   Qs4;''!+++$+a.D2H2H

4    Q4''DK((1,,,JJt$$$$XX\\!((---C

4;q>***FA! #dk""""& s88a<<H!# ' '1IIAC1$4$4OOQF++++OOA&&&&&3,DKKDK  	' 	'BBeG $gg;;"QrT(;;;;;Dgg;;"QrT(;;;;; 3xxx''B ]""s3xx2~~111c#hh"nnOOS"I&&&&r   c                    g }g }d}|t          | j                  k     r | j        ||dz            ddgk    r|                    d           |dz  }n|t          | j                  dz
  k    r'| j        |         dk    r|                    d           n| j        |         dk    r\|t          | j                  dz
  k    r|                    d           nKt          |          dk    r|                    |           g }n |                    | j        |                    |dz  }|t          | j                  k      t          |          dk    rlg }t          |          D ]N\  }}|dk    r.|t          |          dz
  k     r|                    ||g           9|                    |           Odg|z   | _        ng | _        g }|D ]}t          j                    }|d         }	|	dk    r(d                    d |dd	         D                       }n/|	d
k    r(d                    d |dd         D                       }n{t          |          dvr	 t          j        |          }
|d         }|dz  }|dz  }dt          j
        |          z  }|
dv rt          |          dk    r|
dv rt          |          dk    r|                    |||g           |S )r<   r   r=   r>   r	   r?   r)   c              3       K   | ]	}d |z  V  
dS rA   rB   rC   s     r   rF   z;TcpClient.read_beast_buffer_rssi_piaware.<locals>.<genexpr>   rG   r   rH   rI   rJ   c              3       K   | ]	}d |z  V  
dS rA   rB   rC   s     r   rF   z;TcpClient.read_beast_buffer_rssi_piaware.<locals>.<genexpr>   rG   r   rL   rM         
   rP   rN   rT   rO   )r\   r   r4   r]   r^   r3   r_   r`   ra   mathlog10)r   rb   rc   rE   rd   re   r6   rf   r9   rg   ra   raw_rssi
rssi_ratiosignalLevel	dbfs_rssis                  r   read_beast_buffer_rssi_piawarez(TcpClient.read_beast_buffer_rssi_piaware   s   " 
 #dk""""{1q1u9%$55

4   Qs4;''!+++$+a.D2H2H

4    Q4''DK((1,,,JJt$$$$XX\\!((---C

4;q>***FA! #dk""""& s88a<<H!# ' '1IIAC1$4$4OOQF++++OOA&&&&&3,DKKDK  %	2 %	2BBeG $gg;;"QrT(;;;;;Dgg;;"QrT(;;;;; 3xxx'' B!uH!CJ$/KTZ444I ]""s3xx2~~111c#hh"nnOOS)R01111r   c                 *   d}d}t          | j                  |k    rdS g }t          | j                  |k    rYd}| j        |         |k    r| j        ||z            |k    r|dz  }| j        |         dz	  r| j        ||dz            }n| j        ||dz            }d                    d	 |D                       }|dz  }| j        ||d
z            }|d         dz  dz  |d         dz  z  |d         d
z	  z  }|d         dz  dz  |d         dz  z  |d         dz  z  |d         z  }	||	dz  z   }
|d
z  }|dz  }| j        |d         | _        |                    ||
g           n| j        dd         | _        t          | j                  |k    Y|S )a  Skysense stream format.

        ::

            ----------------------------------------------------------------------------------
            Field      SS MS MS MS MS MS MS MS MS MS MS MS MS MS MS TS TS TS TS TS TS RS RS RS
            ----------------------------------------------------------------------------------
            Position:   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
            ----------------------------------------------------------------------------------

            SS field - Start character
            Position 0:
              1 byte = 8 bits
              Start character '$'

            MS field - Payload
            Position 1 through 14:
              14 bytes = 112 bits
              Mode-S payload
              In case of DF types that only carry 7 bytes of information
                position 8 through 14 are set to 0x00.

            TS field - Time stamp
            Position 15 through 20:
              6 bytes = 48 bits
              Time stamp with fields as:

                Lock Status - Status of internal time keeping mechanism
                Equal to 1 if operating normally
                Bit 47 - 1 bit

                Time of day in UTC seconds, between 0 and 86399
                Bits 46 through 30 - 17 bits

                Nanoseconds into current second, between 0 and 999999999
                Bits 29 through 0 - 30 bits

            RS field - Signal Level
            Position 21 through 23:
              3 bytes = 24 bits
              RSSI (received signal strength indication) and relative
                noise level with fields

              RNL, Q12.4 unsigned fixed point binary with 4 fractional
                bits and 8 integer bits.
              This is and indication of the noise level of the message.
                Roughly 40 counts per 10dBm.
              Bits 23 through 12 - 12 bits

              RSSI, Q12.4 unsigned fixed point binary with 4 fractional
                bits and 8 integer bits.
              This is an indication of the signal level of the received
                message in ADC counts. Roughly 40 counts per 10dBm.
              Bits 11 through 0 - 12 bits
        r[   $   Nr   r	   rl   rN   r)   c              3       K   | ]	}d |z  V  
dS rA   rB   )rD   js     r   rF   z1TcpClient.read_skysense_buffer.<locals>.<genexpr>F  s&      ::Qfqj::::::r         rn   r=   ?      rU   rQ   rH   rR   g&.>)r\   r   r_   r4   )r   SS_MSGLENGTHSS_STARTCHARr6   rE   payloadrc   tsbinsecnanor9   s              r   read_skysense_bufferzTcpClient.read_skysense_buffer   s   p t{|++4$+--AA,..KL 01\AAQ;q>Q& 5"k!a"f*5GG #k!a!e)4Ggg::':::::RAAI.a4B.58q=AU1XQR]SAho",Qx2~'Qx1}& Ah  4&=(QQ"k,--8b	****"k!""o= $+--> r   c                 >    |D ]\  }}t          d||fz             dS )z/re-implement this method to handle the messagesz	%15.9f %sN)r   )r   r6   rc   ts       r   handle_messageszTcpClient.handle_messagesZ  s9     	* 	*FC+C())))	* 	*r   Nc                    || _         || _        || _        |                                  	 	 d | j                            d          D             }| j                            |           | j        dk    r| 	                                }n?| j        dk    r| 
                                }n| j        dk    r|                                 }|s|                     |           n]# t          j        j        $ r Y t           $ r;}t#          j                    }| j        | j                            |           |d }~ww xY w)NTc                     g | ]}|S rB   rB   rC   s     r   
<listcomp>z!TcpClient.run.<locals>.<listcomp>g  s    >>>!A>>>r   i   r   r   r   )r   r   r   r#   r   recvr   r^   r   rh   r:   r   r   r   errorAgain	Exception	traceback
format_excput)r   r   r   r   receivedr6   etbs           r   runzTcpClient.run_  s_   &."	>>t{'7'7'='=>>>""8,,, =G++#5577HH]e++#3355HH]j00#88::H 3((2222 9?      )++'3(,,R000	/	s$   BC" C" "D<8	D<6D77D<)NNN)__name__
__module____qualname__r   r#   r'   r:   rh   ru   r   r   r   __classcell__)r   s   @r   r   r      s        $ $ $ $ $ D D D    8U U Un_ _ _B^ ^ ^@* * *
! ! ! ! ! ! ! !r   r   __main__r	   r=   r}   )r   r   r   )__doc__r   sysr3   amModeSr`   r   r   ro   objectr   r   argvr   intr   r   clientr   r'   rB   r   r   <module>r      s   J J 				 



          



 t t t t t t t tn z8A;D3sx{Dx{HYDth???F

 s   2B B2