
    ^i*                         d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZ  ee      j                  j                  Zedz  Zedz  dz  Ze
d	   Zd
dddZ G d d      ZddedefdZy)u  
Layer 3: RF Perturbation Sensor
Detects perturbations in ambient EMF field — not signal extraction,
but field texture reading via RTL-SDR or sound card + wire coil.

States: CALM, STIR, STORM, DEAD
Metrics: amplitude_rms, spectral_centroid, spectral_spread, zero_crossing_rate
    N)Path)datetime)LiteralOptionalmemorydataemf)CALMSTIRSTORMDEADg      Ng      Dg      4)calm_max_dbfsstir_max_dbfsstorm_max_dbfsc            	       8   e Zd ZdZ	 	 	 	 dded   dededefdZdeej                     fd	Z
deej                     fd
Zdej                  fdZdej                  defdZdedee   fdZdedefdZdededee   defdZdefdZdefdZefdedefdZy)PerturbationSensoru   
    RF perturbation sensor using RTL-SDR or sound card + wire coil.
    Reads ambient EMF field texture — not demodulated signals,
    but field characteristics: amplitude, spectral color, texture, activity.
    source)rtlsdr	soundcard
simulationsample_ratecenter_freqgainc                     || _         || _        || _        || _        d| _        ddddddd| _        g | _        d| _        g | _        d | _	        y )Nr         Tr           amplitude_rms_dbfsspectral_centroid_hzspectral_spread_hzzero_crossing_ratedominant_frequency_hzperturbation_count_60szno field detectable)
r   r   r   r   statemetricssources_detectedinterpretation_perturbation_history_last_sample_time)selfr   r   r   r   s        5/home/workspace/ghojualamanchu-v3/emf/perturbation.py__init__zPerturbationSensor.__init__&   sf     &&	!'
"'$%"#"%%&&'
 ,.#8@B"26    returnc                     	 ddl m}  |       }| j                  |_        | j                  |_        | j                  |_        |j                  d      }|j                          |S # t        $ r Y yw xY w)z!Read samples from RTL-SDR dongle.r   )RtlSdri   N)r   r0   r   r   r   read_samplesclose	Exception)r*   r0   sdrsampless       r+   _read_rtlsdrzPerturbationSensor._read_rtlsdr?   sf    
	%(C"..CO"..COyyCH&&z2GIIKN 		s   A"A% %	A10A1c                 |   	 ddl }|j                         }|j                  |j                  ddddd      }|j	                  d      }|j                          |j                          t        j                  |t        j                        }|j                  t        j                        d	z  S # t        $ r Y yw xY w)
z;Read samples from sound card line-in (wire coil interface).r   N   D  T   )formatchannelsrateinputinput_device_indexframes_per_buffer)dtypeg      @)pyaudioPyAudioopenpaInt16readstop_stream	terminatenp
frombufferint16astypefloat32r3   )r*   rB   pstreamr   
audio_datas         r+   _read_soundcardz"PerturbationSensor._read_soundcardM   s    	!AVV#'"&  F ;;t$D KKMt288<J$$RZZ07:: 		s   B,B/ /	B;:B;c                 R   t        j                          }d}d}d}t        j                  |||dz  z   |      }dt        j                  dt        j                  z  |z  |z        z  dt        j                  dt        j                  z  |z  |z        z  z   dt        j
                  j                  |      z  z   }t        |      d	z  dk  r?t        |      d
z  }|||dz   xxx dt        j
                  j                  d      z  z  ccc |j                  t        j                        S )z9Generate simulated RF field for testing without hardware.g      N@g     f@r:   r9   333333?   g?g?   
   2   g?)
timerI   linspacesinpirandomrandnintrL   rM   )r*   t	freq_60hz
freq_180hzntssignalburst_starts           r+   _simulate_fieldz"PerturbationSensor._simulate_fieldc   s     IIK	
[[AE	M1-"&&RUUY.344BFF1ruu9z1B6778RYY__Q''( 	 q6B;?a&2+K;r!12cBIIOOB<O6OO2}}RZZ((r-   r5   c                     t        |      dk  r| j                  S t        j                  t        j                  |dz              }dt        j
                  |dz         z  }t        j                  t        j                  t        j                  |            dk7        t        |      z  }t        j                  j                  |      }t        j                  |      }t        j                  j                  t        |      d      }|j                         dkD  r/t        j                  ||z        t        j                  |      z  }nd}|j                         dkD  rHt        j                  t        j                  ||z
  dz  |z        t        j                  |      z        }	nd}	t        j                  |      }
||
   }t        j                         }| j                  D cg c]  \  }}||z
  dk  s||f c}}| _        |t         d   kD  r| j                  j#                  ||f       t        | j                        }t%        |      t%        |      t%        |	      t%        |      t%        |      |d	S c c}}w )
z.Compute perturbation metrics from raw samples.rT      g-q=r   gwQ>r   <   r   r   )lenr%   rI   sqrtmeanlog10sumdiffsignfftrfftabsrfftfreqargmaxrX   r(   
THRESHOLDSappendfloat)r*   r5   rmsrms_dbfszcrfft_valsfft_magfreqsspectral_centroidspectral_spreaddom_idxdominant_freqnowrc   ampperturbation_counts                   r+   _compute_metricsz#PerturbationSensor._compute_metricsv   s   w<!<< ggbgggqj)*u-- ffRWWRWWW-.!34s7|C 66;;w'&&"Gk: ;;=1 "uw 7"&&/ I # ;;=1 gg!22q8GCDrvvgVO "O ))G$g iik%)%?%?&
!"c38b=RI&
" j11&&--sHo> !;!;< #(/$)*;$<"'"8"'*%*=%9&8
 	
&
s   &I:7I:r%   c                    g }|d   }|d   }|d   }|dk  r|dkD  r|j                  d       |dkD  r|dk  r|j                  d	       |d
kD  r|dk  r|j                  d       |dkD  r|dk  r|j                  d       |dkD  r|dk  r|j                  d       |dkD  r|j                  d       |d   dkD  r|j                  d       |S )z7Infer likely EMF sources from spectral characteristics.r   r"   r!   F   rW   power_line_60hz      power_line_60hz_harmonicsi 5 i cellular_band_850mhzl     l    y* zwifi_2.4ghzi >i ozfm_radio_88-108mhzrS   switch_mode_psu_noiser#   rV   lightning_sferics)rw   )r*   r%   sourcescentroiddom_freqr{   s         r+   _detect_sourcesz"PerturbationSensor._detect_sources   s    1223*+b=X]NN,-c>hnNN67fF!2NN12j X
%:NN=)h8i#7NN/09NN23+,r1NN./r-   c                 b    |d   }|d   }|dk  s|dk(  ry|t         d   k  ry|t         d   k  ry	y
)z"Classify field state from metrics.r   r#   r   r   r   r   r
   r   r   r   )rv   )r*   r%   ry   perturbs       r+   _classify_statez"PerturbationSensor._classify_state   sK    *+23;'Q,:o..:o..r-   r$   r   c                 l    ddddd}|j                  |d      }|r|ddj                  |       d	z  }|S )
z'Generate human-readable interpretation.uD   no field detectable — antenna disconnected or shielded environmentu2   rural/suburban field — minimal human EM activityuE   urban field — moderate human EM activity, cellular and WiFi presentuE   dense EM environment — strong RF sources nearby, possible lightning)r   r
   r   r   unknownz. Detected: z, .)getjoin)r*   r$   r%   r   interpretationsbases         r+   
_interpretzPerturbationSensor._interpret   sQ     [H[\	
 ""5)4l499W#5"6a88Dr-   c                 r   | j                   dk(  r| j                         }n0| j                   dk(  r| j                         }n| j                         }|Ed| _        | j
                  D ci c]  }|d c}| _        g | _        d| _        | j                         S | j                  |      | _        | j                  | j
                        | _        | j                  | j
                        | _        | j                  | j                  | j
                  | j                        | _        | j                         S c c}w )zCTake one reading: acquire samples, compute metrics, classify state.r   r   r   r   zsensor unavailable)r   r6   rQ   rf   r$   r%   r&   r'   r   r   r   r   current_reading)r*   r5   ks      r+   rF   zPerturbationSensor.read   s    ;;("'')G[[K'**,G**,G?DJ,0LL9qAsF9DL$&D!"6D ##%%  009DL$($8$8$FD!--dll;DJ"&//$**dllDLaLa"bD##%% :s   (
D4c                     t        j                         j                         | j                  | j                  | j
                  | j                  | j                  dS )z*Return current reading as structured dict.)	timestampr   field_stater%   r&   r'   )r   r   	isoformatr   r$   r%   r&   r'   )r*   s    r+   r   z"PerturbationSensor.current_reading   sG     "113kk::|| $ 5 5"11
 	
r-   
output_dirc                    |j                  dd       |dz  }| j                         }|d   }d|d    d|d    d	|d
    d|d   dd|d   dd|d   dd|d   dd|d    d|d   r$t        d      j                  d |d   D              nd d|d    d}|j	                  |       t
        dz  }|j                  j                  dd       |j	                  t        j                  |d !             |S )"z*Write perturbation.md to memory directory.T)parentsexist_okzperturbation.mdr%   u1   # Brain Perturbation — RF Layer

## Timestamp
 r   z

## Source
 r   z

## Field State
 r   zE

## Metrics
| Metric | Value |
|--------|-------|
| Amplitude RMS | r   .1fz dBFS |
| Spectral Centroid | r   z.0fz Hz |
| Spectral Spread | r    z Hz |
| Dominant Frequency | r"   z# Hz |
| Perturbation Count (60s) | r#   z |

## Sources Detected
r&   rV   c              3   &   K   | ]	  }d |   yw)z- N ).0ss     r+   	<genexpr>z+PerturbationSensor.write.<locals>.<genexpr>  s     <11#h<s   z- nonez

## Interpretation
r'   z

## States
- CALM: field stable below -60 dBFS
- STIR: minor perturbations (-60 to -40 dBFS)
- STORM: major perturbations (-40 to -20 dBFS)
- DEAD: no field detectable
zperturbation_latest.jsonrT   )indent)	mkdirr   chrr   
write_textDATA_DIRparentjsondumps)r*   r   pathreadingmcontent	json_paths          r+   writezPerturbationSensor.write   sq   5--&&(I 
+  
(  
- 
 )*3/ 0/05 6+,S1 21237 8 89: ; AHHZ@[R<(: ;<<ai j k 		  1@ 	 99	td;TZZ:;r-   N)r   i i (   )__name__
__module____qualname____doc__r   r^   r,   r   rI   ndarrayr6   rQ   rf   dictr   liststrr   
FieldStater   r   rF   r   
MEMORY_DIRr   r   r   r-   r+   r   r      s    @L!$7;<7 7 	7
 72hrzz2 "**!5 ,) )&3


 3
t 3
jt S	 0t 
 
 T DI RU &d &.	
 	
 (2 + +d +r-   r   sensor
interval_sc           	      B   t        d| j                   d| d       	 | j                          | j                          t        dt	        j
                         j                          d| j                   d| j                  d   dd	       t        j                  |       )
z"Run perturbation sensor as daemon.u)   Perturbation sensor starting — source: z, interval: r   [z] z | r   r   z dBFS)printr   rF   r   r   r   r   r$   r%   rX   sleep)r   r   s     r+   daemonr   .  s    	5fmm_LQ[P\\]
^_
(,,.**,-R~SPdAefi@jjopq

:	 r-   )g      @)r   osr   rX   numpyrI   pathlibr   r   typingr   r   __file__r   BASE_DIRr   r   r   rv   r   rx   r   r   r-   r+   <module>r      s    
      $>  '' 
fu$45
 
L L^% 5 r-   