Class: PWN::SDR::Decoder::DECT::DemodIQ

Inherits:
Object
  • Object
show all
Defined in:
lib/pwn/sdr/decoder/dect.rb

Overview

Streaming DECT GFSK demod for Base.run_iq — I/Q → RFPI/A-field.

Instance Method Summary collapse

Constructor Details

#initialize(rate:, carrier: nil, packet: :a_field, encrypted: nil, **context) ⇒ DemodIQ

Returns a new instance of DemodIQ.

Raises:

  • (ArgumentError)


24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/pwn/sdr/decoder/dect.rb', line 24

def initialize(rate:, carrier: nil, packet: :a_field, encrypted: nil, **context)
  raise ArgumentError, 'supported packets are :p00 and :p32' unless i[a_field p00 p32].include?(packet)

  @packet = packet
  @encrypted = encrypted
  @frame_number = context[:frame_number]
  @b_format = context.fetch(:b_format, :unprotected)
  @rate    = rate.to_f
  @carrier = carrier
  @polarity_bits = { false => [], true => [] }
  @skip = { false => 0, true => 0 }
end

Instance Method Details

#feed_bits(bits) ⇒ Object



43
44
45
46
47
# File 'lib/pwn/sdr/decoder/dect.rb', line 43

def feed_bits(bits, &)
  [false, true].each do |inv|
    scan(inv ? bits.map { |b| b ^ 1 } : bits, inv, &) if block_given?
  end
end

#feed_iq(samples, rate: nil) ⇒ Object



37
38
39
40
41
# File 'lib/pwn/sdr/decoder/dect.rb', line 37

def feed_iq(samples, rate: nil, &)
  @rate = rate.to_f if rate
  @slicer ||= Bluetooth::SymbolStream.new(rate: @rate, baud: BAUD)
  feed_bits(@slicer.feed_iq(samples), &)
end