/* -*- c++ -*- */
/* @file
 * @author Piotr Krysik <ptrkrysik@gmail.com>
 * @section LICENSE
 * 
 * Gr-gsm is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3, or (at your option)
 * any later version.
 * 
 * Gr-gsm is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with gr-gsm; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 * 
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gnuradio/io_signature.h>
#include "uplink_downlink_splitter_impl.h"
#include <grgsm/gsmtap.h>
#include <grgsm/endian.h>
#define BURST_SIZE 148
namespace gr {
  namespace grgsm {

    uplink_downlink_splitter::sptr
    uplink_downlink_splitter::make()
    {
      return gnuradio::get_initial_sptr
        (new uplink_downlink_splitter_impl());
    }

    /*
     * The private constructor
     */
    uplink_downlink_splitter_impl::uplink_downlink_splitter_impl()
      : gr::block("uplink_downlink_splitter",
              gr::io_signature::make(0,0,0),
              gr::io_signature::make(0,0,0))
    {
        message_port_register_in(pmt::mp("in"));
        message_port_register_out(pmt::mp("uplink"));
        message_port_register_out(pmt::mp("downlink"));
        set_msg_handler(pmt::mp("in"), boost::bind(&uplink_downlink_splitter_impl::process_msg, this, _1));
    }

    void uplink_downlink_splitter_impl::process_msg(pmt::pmt_t msg)
    {
        gsmtap_hdr * header = (gsmtap_hdr *)(pmt::blob_data(pmt::cdr(msg)));
        bool uplink_burst = (be16toh(header->arfcn) & 0x4000) ? true : false;
        if(uplink_burst)
        {
            message_port_pub(pmt::mp("uplink"), msg);
        } else {
            message_port_pub(pmt::mp("downlink"), msg);
        }
    }

    /*
     * Our virtual destructor.
     */
    uplink_downlink_splitter_impl::~uplink_downlink_splitter_impl()
    {
    }
  } /* namespace grgsm */
} /* namespace gr */

