Skip to content

Commit

Permalink
Reformatting control_channels_decoder
Browse files Browse the repository at this point in the history
  • Loading branch information
ptrkrysik committed Apr 6, 2018
1 parent bb7d94a commit e24860f
Showing 1 changed file with 55 additions and 59 deletions.
114 changes: 55 additions & 59 deletions lib/decoding/control_channels_decoder_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,21 @@ namespace gr {

static int ubits2sbits(ubit_t *ubits, sbit_t *sbits, int count)
{
int i;
int i;

for (i = 0; i < count; i++) {
if (*ubits == 0x23) {
ubits++;
sbits++;
continue;
}
if ((*ubits++) & 1)
*sbits++ = -127;
else
*sbits++ = 127;
}
for (i = 0; i < count; i++) {
if (*ubits == 0x23) {
ubits++;
sbits++;
continue;
}
if ((*ubits++) & 1)
*sbits++ = -127;
else
*sbits++ = 127;
}

return count;
return count;
}

control_channels_decoder::sptr
Expand All @@ -68,10 +68,10 @@ namespace gr {
gr::io_signature::make(0, 0, 0)),
d_collected_bursts_num(0)
{
//setup input/output ports
message_port_register_in(pmt::mp("bursts"));
set_msg_handler(pmt::mp("bursts"), boost::bind(&control_channels_decoder_impl::decode, this, _1));
message_port_register_out(pmt::mp("msgs"));
//setup input/output ports
message_port_register_in(pmt::mp("bursts"));
set_msg_handler(pmt::mp("bursts"), boost::bind(&control_channels_decoder_impl::decode, this, _1));
message_port_register_out(pmt::mp("msgs"));
}

control_channels_decoder_impl::~control_channels_decoder_impl()
Expand All @@ -80,51 +80,47 @@ namespace gr {

void control_channels_decoder_impl::decode(pmt::pmt_t msg)
{
ubit_t bursts_u[116 * 4];
sbit_t bursts_s[116 * 4];
uint8_t result[23];
int n_errors, n_bits_total;
int8_t header_plus_data[sizeof(gsmtap_hdr)+DATA_BYTES];

d_bursts[d_collected_bursts_num] = msg;
d_collected_bursts_num++;

//get convecutive bursts
if(d_collected_bursts_num==4)
ubit_t bursts_u[116 * 4];
sbit_t bursts_s[116 * 4];
uint8_t result[23];
int n_errors, n_bits_total;
int8_t header_plus_data[sizeof(gsmtap_hdr)+DATA_BYTES];

d_bursts[d_collected_bursts_num] = msg;
d_collected_bursts_num++;

//get convecutive bursts
if(d_collected_bursts_num==4)
{
d_collected_bursts_num=0;
//reorganize data from input bursts
for(int ii = 0; ii < 4; ii++)
{
d_collected_bursts_num=0;
//reorganize data from input bursts
for(int ii = 0; ii < 4; ii++)
{
pmt::pmt_t header_plus_burst = pmt::cdr(d_bursts[ii]);
int8_t * burst_bits = (int8_t *)(pmt::blob_data(header_plus_burst))+sizeof(gsmtap_hdr);
pmt::pmt_t header_plus_burst = pmt::cdr(d_bursts[ii]);
int8_t * burst_bits = (int8_t *)(pmt::blob_data(header_plus_burst))+sizeof(gsmtap_hdr);

memcpy(&bursts_u[ii*116], &burst_bits[3],58);
memcpy(&bursts_u[ii*116+58], &burst_bits[3+57+1+26],58);
}
//convert to soft bits
ubits2sbits(bursts_u, bursts_s, 116 * 4);
//decode
if (-1 == gsm0503_xcch_decode(result, bursts_s, &n_errors, &n_bits_total))
{
//Possibly an encrypted message
return;
}

//extract header of the first burst of the four bursts
pmt::pmt_t first_header_plus_burst = pmt::cdr(d_bursts[0]);
gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(first_header_plus_burst);
//copy header and data
memcpy(header_plus_data, header, sizeof(gsmtap_hdr));
memcpy(header_plus_data+sizeof(gsmtap_hdr), result, DATA_BYTES);
//set data type in the header
((gsmtap_hdr*)header_plus_data)->type = GSMTAP_TYPE_UM;
//prepare message
pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, pmt::make_blob(header_plus_data,DATA_BYTES+sizeof(gsmtap_hdr)));
//send message to the output
message_port_pub(pmt::mp("msgs"), msg_out);
memcpy(&bursts_u[ii*116], &burst_bits[3],58);
memcpy(&bursts_u[ii*116+58], &burst_bits[3+57+1+26],58);
}
//convert to soft bits
ubits2sbits(bursts_u, bursts_s, 116 * 4);
//decode
if (gsm0503_xcch_decode(result, bursts_s, &n_errors, &n_bits_total) != -1)
{
//extract header of the first burst of the four bursts
pmt::pmt_t first_header_plus_burst = pmt::cdr(d_bursts[0]);
gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(first_header_plus_burst);
//copy header and data
memcpy(header_plus_data, header, sizeof(gsmtap_hdr));
memcpy(header_plus_data+sizeof(gsmtap_hdr), result, DATA_BYTES);
//set data type in the header
((gsmtap_hdr*)header_plus_data)->type = GSMTAP_TYPE_UM;
//prepare message
pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, pmt::make_blob(header_plus_data,DATA_BYTES+sizeof(gsmtap_hdr)));
//send message to the output
message_port_pub(pmt::mp("msgs"), msg_out);
}
return;
}
}
} /* namespace gsm */
} /* namespace gr */
Expand Down

0 comments on commit e24860f

Please sign in to comment.