summaryrefslogtreecommitdiff
path: root/gr-pager/lib/flex_parse_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-pager/lib/flex_parse_impl.cc')
-rw-r--r--gr-pager/lib/flex_parse_impl.cc258
1 files changed, 0 insertions, 258 deletions
diff --git a/gr-pager/lib/flex_parse_impl.cc b/gr-pager/lib/flex_parse_impl.cc
deleted file mode 100644
index 80123da229..0000000000
--- a/gr-pager/lib/flex_parse_impl.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2006,2007,2010,2012 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio 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.
- *
- * GNU Radio 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 GNU Radio; 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 "flex_parse_impl.h"
-#include "bch3221.h"
-#include <gnuradio/io_signature.h>
-#include <ctype.h>
-#include <iostream>
-#include <iomanip>
-
-namespace gr {
- namespace pager {
-
- flex_parse::sptr
- flex_parse::make(msg_queue::sptr queue, float freq)
- {
- return gnuradio::get_initial_sptr
- (new flex_parse_impl(queue, freq));
- }
-
- flex_parse_impl::flex_parse_impl(msg_queue::sptr queue, float freq) :
- sync_block("flex_parse",
- io_signature::make(1, 1, sizeof(int32_t)),
- io_signature::make(0, 0, 0)),
- d_queue(queue),
- d_freq(freq)
- {
- d_count = 0;
- }
-
- flex_parse_impl::~flex_parse_impl()
- {
- }
-
- int flex_parse_impl::work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
- {
- const int32_t *in = (const int32_t *)input_items[0];
-
- int i = 0;
- while(i < noutput_items) {
- // Accumulate one whole frame's worth of data words (88 of them)
- d_datawords[d_count] = *in++; i++;
- if(++d_count == 88) {
- parse_data();
- d_count = 0;
- }
- }
-
- return i;
- }
-
- /* FLEX data frames (that is, 88 data words per phase recovered
- after sync, symbol decoding, dephasing, deinterleaving, error
- correction, and conversion from codewords to data words) start
- with a block information word containing indices of the page
- address field and page vector fields. */
- void
- flex_parse_impl::parse_capcode(int aw1, int aw2)
- {
- d_laddr = (aw1 < 0x008001L) ||
- (aw1 > 0x1E0000L) ||
- (aw1 > 0x1E7FFEL);
-
- if(d_laddr)
- d_capcode = aw1+((aw2^0x001FFFFF)<<15)+0x1F9000; // Don't ask
- else
- d_capcode = aw1-0x8000;
- }
-
- void
- flex_parse_impl::parse_data()
- {
- // Block information word is the first data word in frame
- int biw = d_datawords[0];
-
- // Nothing to see here, please move along
- if(biw == 0 || biw == 0x001FFFFF)
- return;
-
- // Vector start index is bits 15-10
- // Address start address is bits 9-8, plus one for offset
- int voffset = (biw >> 10) & 0x3f;
- int aoffset = ((biw >> 8) & 0x03) + 1;
-
- //printf("BIW:%08X AW:%02i-%02i\n", biw, aoffset, voffset);
-
- // Iterate through pages and dispatch to appropriate handler
- for(int i = aoffset; i < voffset; i++) {
- int j = voffset+i-aoffset; // Start of vector field for address @ i
-
- if(d_datawords[i] == 0x00000000 ||
- d_datawords[i] == 0x001FFFFF)
- continue; // Idle codewords, invalid address
-
- parse_capcode(d_datawords[i], d_datawords[i+1]);
- if(d_laddr)
- i++;
-
- if(d_capcode < 0) // Invalid address, skip
- continue;
-
- // Parse vector information word for address @ offset 'i'
- int viw = d_datawords[j];
- d_type = (page_type_t)((viw >> 4) & 0x00000007);
- int mw1 = (viw >> 7) & 0x00000007F;
- int len = (viw >> 14) & 0x0000007F;
-
- if(is_numeric_page(d_type))
- len &= 0x07;
- int mw2 = mw1+len;
-
- if(mw1 == 0 && mw2 == 0)
- continue; // Invalid VIW
-
- if(is_tone_page(d_type))
- mw1 = mw2 = 0;
-
- if(mw1 > 87 || mw2 > 87)
- continue; // Invalid offsets
-
- d_payload.str("");
- d_payload.setf(std::ios::showpoint);
- d_payload << std::setprecision(6) << std::setw(7)
- << d_freq/1e6 << FIELD_DELIM
- << std::setw(10) << d_capcode << FIELD_DELIM
- << flex_page_desc[d_type] << FIELD_DELIM;
-
- if(is_alphanumeric_page(d_type))
- parse_alphanumeric(mw1, mw2-1, j);
- else if(is_numeric_page(d_type))
- parse_numeric(mw1, mw2, j);
- else if(is_tone_page(d_type))
- parse_tone_only();
- else
- parse_unknown(mw1, mw2);
-
- message::sptr msg = message::make_from_string(std::string(d_payload.str()));
- d_queue->handle(msg);
- }
- }
-
- void
- flex_parse_impl::parse_alphanumeric(int mw1, int mw2, int j)
- {
- int frag;
- //bool cont;
-
- if(!d_laddr) {
- frag = (d_datawords[mw1] >> 11) & 0x03;
- //cont = (d_datawords[mw1] >> 10) & 0x01;
- mw1++;
- }
- else {
- frag = (d_datawords[j+1] >> 11) & 0x03;
- //cont = (d_datawords[j+1] >> 10) & 0x01;
- mw2--;
- }
-
- //d_payload << frag << FIELD_DELIM;
- //d_payload << cont << FIELD_DELIM;
-
- for(int i = mw1; i <= mw2; i++) {
- int dw = d_datawords[i];
- unsigned char ch;
-
- if(i > mw1 || frag != 0x03) {
- ch = dw & 0x7F;
- if(ch != 0x03)
- d_payload << ch;
- }
-
- ch = (dw >> 7) & 0x7F;
- if(ch != 0x03) // Fill
- d_payload << ch;
-
- ch = (dw >> 14) & 0x7F;
- if(ch != 0x03) // Fill
- d_payload << ch;
- }
- }
-
- void
- flex_parse_impl::parse_numeric(int mw1, int mw2, int j)
- {
- // Get first dataword from message field or from second
- // vector word if long address
- int dw;
- if(!d_laddr) {
- dw = d_datawords[mw1];
- mw1++;
- mw2++;
- }
- else {
- dw = d_datawords[j+1];
- }
-
- unsigned char digit = 0;
- int count = 4;
- if(d_type == FLEX_NUMBERED_NUMERIC)
- count += 10; // Skip 10 header bits for numbered numeric pages
- else
- count += 2; // Otherwise skip 2
-
- for(int i = mw1; i <= mw2; i++) {
- for(int k = 0; k < 21; k++) {
- // Shift LSB from data word into digit
- digit = (digit >> 1) & 0x0F;
- if(dw & 0x01)
- digit ^= 0x08;
- dw >>= 1;
- if(--count == 0) {
- if(digit != 0x0C) // Fill
- d_payload << flex_bcd[digit];
- count = 4;
- }
- }
-
- dw = d_datawords[i];
- }
- }
-
- void
- flex_parse_impl::parse_tone_only()
- {
- }
-
- void
- flex_parse_impl::parse_unknown(int mw1, int mw2)
- {
- }
-
- } /* namespace pager */
-} /* namespace gr */