diff options
Diffstat (limited to 'gnuradio-core')
-rw-r--r-- | gnuradio-core/src/lib/general/CMakeLists.txt | 1 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/general.i | 2 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_endian_swap.cc | 101 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_endian_swap.h | 57 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_endian_swap.i | 31 | ||||
-rw-r--r-- | gnuradio-core/src/python/gnuradio/gr/prefs.py | 11 | ||||
-rw-r--r-- | gnuradio-core/src/python/gnuradio/gr/qa_endian_swap.py | 66 |
7 files changed, 264 insertions, 5 deletions
diff --git a/gnuradio-core/src/lib/general/CMakeLists.txt b/gnuradio-core/src/lib/general/CMakeLists.txt index 5c7b0f374..3cf7f74e4 100644 --- a/gnuradio-core/src/lib/general/CMakeLists.txt +++ b/gnuradio-core/src/lib/general/CMakeLists.txt @@ -207,6 +207,7 @@ set(gr_core_general_triple_threats gr_deinterleave gr_delay gr_encode_ccsds_27_bb + gr_endian_swap gr_fake_channel_coder_pp gr_feedforward_agc_cc gr_feval diff --git a/gnuradio-core/src/lib/general/general.i b/gnuradio-core/src/lib/general/general.i index c0ce65527..790549c4d 100644 --- a/gnuradio-core/src/lib/general/general.i +++ b/gnuradio-core/src/lib/general/general.i @@ -60,6 +60,7 @@ #include <gr_complex_to_interleaved_short.h> #include <gr_interleaved_short_to_complex.h> //#include <gr_endianness.h> +#include <gr_endian_swap.h> #include <gr_firdes.h> #include <gr_interleave.h> #include <gr_deinterleave.h> @@ -181,6 +182,7 @@ %include "gr_complex_to_xxx.i" %include "gr_complex_to_interleaved_short.i" //%include "gr_endianness.i" +%include "gr_endian_swap.i" %include "gr_interleaved_short_to_complex.i" %include "gr_firdes.i" %include "gr_interleave.i" diff --git a/gnuradio-core/src/lib/general/gr_endian_swap.cc b/gnuradio-core/src/lib/general/gr_endian_swap.cc new file mode 100644 index 000000000..d86da5aa7 --- /dev/null +++ b/gnuradio-core/src/lib/general/gr_endian_swap.cc @@ -0,0 +1,101 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,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 <gr_endian_swap.h> +#include <gr_io_signature.h> +#include <volk/volk.h> + +gr_endian_swap_sptr +gr_make_endian_swap (size_t item_size_bytes) +{ + return gnuradio::get_initial_sptr(new gr_endian_swap (item_size_bytes)); +} + +gr_endian_swap::gr_endian_swap (size_t item_size_bytes) + : gr_sync_block ("gr_endian_swap", + gr_make_io_signature (1, 1, item_size_bytes), + gr_make_io_signature (1, 1, item_size_bytes)) +{ + const int alignment_multiple = volk_get_alignment(); + set_alignment(std::max(1,alignment_multiple)); +} + +int +gr_endian_swap::work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + const char *in = (const char *) input_items[0]; + char *out = (char *) output_items[0]; + + int nbytes( d_output_signature->sizeof_stream_item(0) ); + if(is_unaligned()) { + switch(nbytes){ + case 1: + memcpy(out,in,noutput_items); + break; + case 2: + memcpy(out,in,2*noutput_items); + volk_16u_byteswap_u((uint16_t*)out,noutput_items); + break; + case 4: + memcpy(out,in,4*noutput_items); + volk_32u_byteswap_u((uint32_t*)out,noutput_items); + break; + case 8: + memcpy(out,in,8*noutput_items); + volk_64u_byteswap_u((uint64_t*)out,noutput_items); + break; + default: + throw std::runtime_error("itemsize is not valid for gr_endian_swap!"); + } + } else { + switch(nbytes){ + case 1: + memcpy(out,in,noutput_items); + break; + case 2: + memcpy(out,in,2*noutput_items); + volk_16u_byteswap_a((uint16_t*)out,noutput_items); + break; + case 4: + memcpy(out,in,4*noutput_items); + volk_32u_byteswap_a((uint32_t*)out,noutput_items); + break; + case 8: + memcpy(out,in,8*noutput_items); + volk_64u_byteswap_a((uint64_t*)out,noutput_items); + break; + default: + throw std::runtime_error("itemsize is not valid for gr_endian_swap!"); + } + } + + return noutput_items; +} + + + diff --git a/gnuradio-core/src/lib/general/gr_endian_swap.h b/gnuradio-core/src/lib/general/gr_endian_swap.h new file mode 100644 index 000000000..0baa3f338 --- /dev/null +++ b/gnuradio-core/src/lib/general/gr_endian_swap.h @@ -0,0 +1,57 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,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. + */ + +#ifndef INCLUDED_GR_ENDIAN_SWAP_H +#define INCLUDED_GR_ENDIAN_SWAP_H + +#include <gr_core_api.h> +#include <gr_sync_block.h> + +class gr_endian_swap; +typedef boost::shared_ptr<gr_endian_swap> gr_endian_swap_sptr; + +GR_CORE_API gr_endian_swap_sptr +gr_make_endian_swap (size_t item_size_bytes=1); + +/*! + * \brief Convert stream of items into thier byte swapped version + * + * \param item_size_bytes number of bytes per item, 1=no-op,2=uint16_t,4=uint32_t,8=uint64_t + */ + +class GR_CORE_API gr_endian_swap : public gr_sync_block +{ + private: + friend GR_CORE_API gr_endian_swap_sptr + gr_make_endian_swap (size_t item_size_bytes); + gr_endian_swap (size_t item_size_bytes); + + size_t item_size_bytes; + + public: + virtual int work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + + +#endif /* INCLUDED_GR_ENDIAN_SWAP_H */ diff --git a/gnuradio-core/src/lib/general/gr_endian_swap.i b/gnuradio-core/src/lib/general/gr_endian_swap.i new file mode 100644 index 000000000..6058b9de7 --- /dev/null +++ b/gnuradio-core/src/lib/general/gr_endian_swap.i @@ -0,0 +1,31 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,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. + */ + +GR_SWIG_BLOCK_MAGIC(gr,endian_swap) + +gr_endian_swap_sptr +gr_make_endian_swap (size_t bytes_per_item=1); + +class gr_endian_swap : public gr_sync_block +{ +public: +}; diff --git a/gnuradio-core/src/python/gnuradio/gr/prefs.py b/gnuradio-core/src/python/gnuradio/gr/prefs.py index 644aea848..25fa8cd6a 100644 --- a/gnuradio-core/src/python/gnuradio/gr/prefs.py +++ b/gnuradio-core/src/python/gnuradio/gr/prefs.py @@ -27,6 +27,7 @@ import ConfigParser import os import os.path import sys +import glob def _user_prefs_filename(): @@ -53,18 +54,18 @@ class _prefs(_prefs_base): invoke the methods in this python class. """ def __init__(self): - _prefs_base.__init__(self) - self.cp = ConfigParser.RawConfigParser() - self.__getattr__ = lambda self, name: getattr(self.cp, name) + _prefs_base.__init__(self) + self.cp = ConfigParser.RawConfigParser() + self.__getattr__ = lambda self, name: getattr(self.cp, name) def _sys_prefs_filenames(self): dir = _sys_prefs_dirname() try: - fnames = os.listdir(dir) + fnames = glob.glob(os.path.join(dir, '*.conf')) except (IOError, OSError): return [] fnames.sort() - return [os.path.join(dir, f) for f in fnames] + return fnames def _read_files(self): filenames = self._sys_prefs_filenames() diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_endian_swap.py b/gnuradio-core/src/python/gnuradio/gr/qa_endian_swap.py new file mode 100644 index 000000000..4d2555cc4 --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/gr/qa_endian_swap.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# +# Copyright 2011,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. +# + +from gnuradio import gr, gr_unittest +import ctypes + +class test_endian_swap (gr_unittest.TestCase): + + def setUp (self): + self.tb = gr.top_block () + + def tearDown (self): + self.tb = None + + def test_001(self): + + src_data = [1,2,3,4] + expected_result = [256, 512, 768, 1024]; + + src = gr.vector_source_s(src_data) + op = gr.endian_swap(2) + dst = gr.vector_sink_s() + + self.tb.connect(src, op, dst) + self.tb.run() + result_data = list(dst.data()) + + self.assertEqual(expected_result, result_data) + + def test_002(self): + + src_data = [1,2,3,4] + expected_result = [16777216, 33554432, 50331648, 67108864]; + + src = gr.vector_source_i(src_data) + op = gr.endian_swap(4) + dst = gr.vector_sink_i() + + self.tb.connect(src, op, dst) + self.tb.run() + result_data = list(dst.data()) + + self.assertEqual(expected_result, result_data) + +if __name__ == '__main__': + gr_unittest.run(test_endian_swap, "test_endian_swap.xml") + |