From 08f95b2ac7f377f98f83761b52027b88824d7a64 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 13 Oct 2008 09:02:02 +0200 Subject: initial import of gssm-v0.1.1a --- gssm/src/lib/gssm_sink.h | 125 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 gssm/src/lib/gssm_sink.h (limited to 'gssm/src/lib/gssm_sink.h') diff --git a/gssm/src/lib/gssm_sink.h b/gssm/src/lib/gssm_sink.h new file mode 100644 index 0000000..3e8a57f --- /dev/null +++ b/gssm/src/lib/gssm_sink.h @@ -0,0 +1,125 @@ +// $Id: gssm_sink.h,v 1.2 2007-07-07 16:31:42 jl Exp $ + +#pragma once + +#include +#include +#include +#include "gssm_state.h" + +class gssm_sink; +typedef boost::shared_ptr gssm_sink_sptr; +gssm_sink_sptr gssm_make_sink(double); + +class gssm_sink : public gr_sync_block { + +public: + ~gssm_sink(void); + + int work(int nitems, gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + +private: + // sample speeds + double d_sps; // samples per second + double d_samples_per_symbol; + + // M&M clock recovery + gri_mmse_fir_interpolator *d_interp; + double d_mu; + double d_gain_mu; + double d_omega; + double d_gain_omega; + double d_omega_relative_limit; + double d_max_omega; + double d_min_omega; + float d_last_sample; + + double d_mu_bak; + double d_omega_bak; + double d_last_sample_bak; + + int d_bitno; + + // buffers + gr_buffer_sptr d_buf_qd; + gr_buffer_reader_sptr d_qd_reader; + gr_buffer_sptr d_buf_mm; + gr_buffer_reader_sptr d_mm_reader; + + // quad demod + gr_complex d_qd_last; + double d_qd_gain; + + // GSM BTS timing + int d_tn; // time slot + int d_fn; // frame number + int d_fnm51; // frame number mod 51 + int d_fnm102; // frame number mod 102 + int d_bsic; // current bsic + + // program state + gssm_state_t d_state; + + // buffer to hold physical data + unsigned char * d_phy_buf; + int * d_phy_ind; + + // Wireshark interface + int d_tunfd; // TUN fd + unsigned char d_ether_addr[ETH_ALEN]; + + /*******************************************************************/ + + friend gssm_sink_sptr gssm_make_sink(double); + gssm_sink(double); + + int search_state_fc(const float *, int); + int search_state_s(const float *, int); + int search_state_data(const float *, int); + + void search_sch(const unsigned char *); + int handle_sch(const unsigned char *, int *, int *); + + void next_timeslot(void); + + int check_logical_channel(int, int, int, int); + void check_logical_channels(void); + + int mm_demod(const float *, int, float *, int &); + int quad_demod(const gr_complex *, int, float *, int &); + int process_input(const gr_complex *, int); + int process_qd(const gr_complex *, int); + + void save_clock(); + void restore_clock(); + void reset_clock(); + void flush_buffers(); + void reset_state(); + + + /*******************************************************************/ + // Debug + + int check_num_invalid_s(); + +public: + int d_search_fc_count, + d_found_fc_count, + d_valid_s, + d_invalid_s, + d_invalid_s_1, + d_valid_bcch, + d_invalid_bcch, + d_valid_ia, + d_invalid_ia, + d_valid_sdcch4, + d_invalid_sdcch4, + d_valid_sacchc4, + d_invalid_sacchc4, + d_valid_sdcch8, + d_invalid_sdcch8, + d_valid_sacchc8, + d_invalid_sacchc8; + void stats(); +}; -- cgit v1.2.3