From 85b76dd55f422cf70238c58f2e39c2c28555f6ce Mon Sep 17 00:00:00 2001 From: jcorgan Date: Tue, 27 Jan 2009 18:00:05 +0000 Subject: [PATCH] General housekeeping--removing ancient cruft mostly. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10315 221aa14e-8319-0410-a670-987f0aec2ac5 --- gnuradio-core/ChangeLog | 1899 ----------------- gnuradio-core/THANKS | 7 - gnuradio-examples/ChangeLog | 385 ---- .../python/limbo/networking/Makefile.am | 23 - .../limbo/networking/measurement_slave.py | 241 --- .../python/limbo/sounder/Makefile.am | 30 - .../python/limbo/sounder/sounder_rx.py | 53 - .../python/limbo/sounder/sounder_tx.py | 45 - .../python/limbo/sounder/usrp_sink.py | 117 - .../python/limbo/sounder/usrp_sounder_rx.py | 95 - .../python/limbo/sounder/usrp_sounder_tx.py | 110 - .../python/limbo/sounder/usrp_source.py | 126 -- gnuradio-examples/python/usrp/limbo/am_rcv.py | 115 - .../python/usrp/limbo/ayfabtu.dat | Bin 544640 -> 0 bytes .../python/usrp/limbo/ayfabtu.py | 169 -- .../python/usrp/limbo/flexrf_debug.py | 169 -- .../python/usrp/limbo/flexrf_siggen.py | 148 -- gr-atsc/ChangeLog | 37 - gr-audio-alsa/AUTHORS | 2 - gr-audio-alsa/ChangeLog | 88 - gr-audio-jack/AUTHORS | 1 - gr-audio-jack/ChangeLog | 42 - gr-audio-oss/ChangeLog | 91 - gr-audio-osx/AUTHORS | 1 - gr-audio-osx/ChangeLog | 25 - gr-audio-portaudio/AUTHORS | 2 - gr-audio-portaudio/ChangeLog | 31 - gr-audio-windows/AUTHORS | 2 - gr-audio-windows/ChangeLog | 42 - gr-comedi/AUTHORS | 1 - gr-comedi/ChangeLog | 25 - gr-gsm-fr-vocoder/AUTHORS | 3 - gr-gsm-fr-vocoder/ChangeLog | 45 - gr-msdd6000/AUTHORS | 3 - gr-pager/AUTHORS | 1 - gr-radio-astronomy/AUTHORS | 2 - gr-radio-astronomy/ChangeLog | 30 - gr-trellis/AUTHORS | 1 - gr-trellis/ChangeLog | 24 - gr-usrp/AUTHORS | 1 - gr-usrp/ChangeLog | 374 ---- gr-video-sdl/AUTHORS | 1 - gr-video-sdl/ChangeLog | 25 - gr-wxgui/ChangeLog | 171 -- gruel/AUTHORS | 1 - gruel/ChangeLog | 20 - mblock/AUTHORS | 1 - mblock/ChangeLog | 20 - pmt/AUTHORS | 1 - pmt/ChangeLog | 26 - usrp/AUTHORS | 4 - usrp/ChangeLog | 1066 --------- usrp/doc/Makefile.am | 2 +- usrp2/firmware/apps/Makefile.am | 2 + 54 files changed, 3 insertions(+), 5943 deletions(-) delete mode 100644 gnuradio-core/ChangeLog delete mode 100644 gnuradio-core/THANKS delete mode 100644 gnuradio-examples/ChangeLog delete mode 100644 gnuradio-examples/python/limbo/networking/Makefile.am delete mode 100755 gnuradio-examples/python/limbo/networking/measurement_slave.py delete mode 100644 gnuradio-examples/python/limbo/sounder/Makefile.am delete mode 100644 gnuradio-examples/python/limbo/sounder/sounder_rx.py delete mode 100644 gnuradio-examples/python/limbo/sounder/sounder_tx.py delete mode 100644 gnuradio-examples/python/limbo/sounder/usrp_sink.py delete mode 100755 gnuradio-examples/python/limbo/sounder/usrp_sounder_rx.py delete mode 100755 gnuradio-examples/python/limbo/sounder/usrp_sounder_tx.py delete mode 100644 gnuradio-examples/python/limbo/sounder/usrp_source.py delete mode 100755 gnuradio-examples/python/usrp/limbo/am_rcv.py delete mode 100644 gnuradio-examples/python/usrp/limbo/ayfabtu.dat delete mode 100755 gnuradio-examples/python/usrp/limbo/ayfabtu.py delete mode 100755 gnuradio-examples/python/usrp/limbo/flexrf_debug.py delete mode 100755 gnuradio-examples/python/usrp/limbo/flexrf_siggen.py delete mode 100644 gr-atsc/ChangeLog delete mode 100644 gr-audio-alsa/AUTHORS delete mode 100644 gr-audio-alsa/ChangeLog delete mode 100644 gr-audio-jack/AUTHORS delete mode 100644 gr-audio-jack/ChangeLog delete mode 100644 gr-audio-oss/ChangeLog delete mode 100644 gr-audio-osx/AUTHORS delete mode 100644 gr-audio-osx/ChangeLog delete mode 100644 gr-audio-portaudio/AUTHORS delete mode 100644 gr-audio-portaudio/ChangeLog delete mode 100644 gr-audio-windows/AUTHORS delete mode 100644 gr-audio-windows/ChangeLog delete mode 100644 gr-comedi/AUTHORS delete mode 100644 gr-comedi/ChangeLog delete mode 100644 gr-gsm-fr-vocoder/AUTHORS delete mode 100644 gr-gsm-fr-vocoder/ChangeLog delete mode 100644 gr-msdd6000/AUTHORS delete mode 100644 gr-pager/AUTHORS delete mode 100644 gr-radio-astronomy/AUTHORS delete mode 100644 gr-radio-astronomy/ChangeLog delete mode 100644 gr-trellis/AUTHORS delete mode 100644 gr-trellis/ChangeLog delete mode 100644 gr-usrp/AUTHORS delete mode 100644 gr-usrp/ChangeLog delete mode 100644 gr-video-sdl/AUTHORS delete mode 100644 gr-video-sdl/ChangeLog delete mode 100644 gr-wxgui/ChangeLog delete mode 100644 gruel/AUTHORS delete mode 100644 gruel/ChangeLog delete mode 100644 mblock/AUTHORS delete mode 100644 mblock/ChangeLog delete mode 100644 pmt/AUTHORS delete mode 100644 pmt/ChangeLog delete mode 100644 usrp/AUTHORS delete mode 100644 usrp/ChangeLog diff --git a/gnuradio-core/ChangeLog b/gnuradio-core/ChangeLog deleted file mode 100644 index 6b5bbadb..00000000 --- a/gnuradio-core/ChangeLog +++ /dev/null @@ -1,1899 +0,0 @@ -2006-08-01 Achilleas Anastasopoulos - - * src/lib/general/gr_packed_to_unpacked_XX.cc.t, - src/lib/general/gr_unpacked_to_packed_XX.cc.t: fixed bug in - multiple stream support. - -2006-07-06 Tom Rondeau - - * src/python/gnuradio/blksimpl/gmsk2.py: - Added AGC to GMSK code. - -2006-07-06 Tom Rondeau - - * src/python/gnuradio/blksimpl/Makefile.am: - Call to gmsk.py was causing error after removal of gmsk.py file. - Removed call in Makefile.am to this. - -2006-07-05 Eric Blossom - - * src/python/gnuradio/blksimpl/gmsk.py: Removed long deprecated - code. We'll give this a week or so for the dust to settle, then - we'll rename gmsk2.py to gmsk.py - -2006-06-29 Tom Rondeau - - * src/lib/general/gr_correlate_access_code_bb.cc (work): - Removed branches; cleaned up code to only deal with a 180 degree phase shift in - BPSK. - -2006-06-28 Tom Rondeau - - * src/python/gnuradio/gr/qa_correlate_access_code.py (test_correlate_access_code.test_001): - Changes to access code correlator to handle BPSK phase reversal - killed qa_correlate_access_code. Modified the access code search in - test_001 to all the test to pass properly. - -2006-06-28 Tom Rondeau - - * src/lib/general/gr_constellation_decoder_cb.cc: - Set Compute_EVN=false by default (to clean up the output) - -2006-06-20 Tom Rondeau - - * src/lib/general/gr_costas_loop_cc.{h,cc,i}: modified to support - both BPSK and QPSK via "order" constructor argument. Removed - unused ref_phase ctor arg. - -2006-06-20 Eric Blossom - - * src/lib/general/gr_probe_avg_mag_sqrd_{f,c}.{h,cc,i}: added accessor - for threshold. - - * src/python/gnuradio/blksimpl/pkt.py: result of refactoring - gmsk2_pkt.py. This is the common packet handling framework, and - is modulation independent. gmsk2_pkt is now deprecated. - - * src/python/gnuradio/blksimpl/gmsk2_pkt.py: added deprecation warning. - - * src/python/gnuradio/packet_utils.py (make_packet): added - bits_per_baud parameter to handle QPSK, etc in the future. - -2006-06-17 Eric Blossom - - * src/lib/runtime/gr_realtime.{h,cc,i}: new function to enable - realtime scheduling. - -2006-06-15 Eric Blossom - - * src/lib/io/gr_oscope_guts.{h,cc,i}, - src/lib/io/gr_oscope_sink_x.{h,cc}: added set_sample_rate method. - - * src/lib/general/gr_keep_one_in_n.{h,cc,i}: added set_n method. - -2006-06-13 Eric Blossom - - * src/lib/general/gr_binary_slicer_fb.h: corrected calling sequence. - -2006-06-08 Eric Blossom - - * src/lib/general/gr_feval.{h,cc,i}, - src/python/gnuradio/gr/qa_feval.py: new C++/python helper that - allows C++ code to evaluate a function defined in Python. Uses - SWIG directors. - -2006-06-06 Eric Blossom - - * src/lib/general/gr_unpack_k_bits_bb.cc (work): bug fix. Was - computing the wrong answer and writing *way* too much data if k was > 1. - * src/python/gnuradio/gr/qa_unpack_k_bits.py: new ;) - - * src/lib/general/gr_diff_decoder_bb.{h,cc,i}: new. differential - decoder. constellation index in / constellation index out. - - * src/lib/general/gr_map_bb.{h,cc,i}: new. map any byte into any - other byte. - -2006-06-01 Eric Blossom - - * src/lib/filter/ccomplex_dotprod_3dnow64.S, - src/lib/filter/3dnow_float_dotprod_really_simple.S, - src/lib/filter/3dnow_float_dotprod_simple.S, - src/lib/filter/assembly.h, - src/lib/filter/ccomplex_dotprod_3dnow.S, - src/lib/filter/ccomplex_dotprod_3dnow64.S, - src/lib/filter/ccomplex_dotprod_3dnowext.S, - src/lib/filter/ccomplex_dotprod_3dnowext64.S, - src/lib/filter/ccomplex_dotprod_sse.S, - src/lib/filter/ccomplex_dotprod_sse64.S, - src/lib/filter/complex_dotprod_3dnow.S, - src/lib/filter/complex_dotprod_3dnow64.S, - src/lib/filter/complex_dotprod_3dnowext.S, - src/lib/filter/complex_dotprod_3dnowext64.S, - src/lib/filter/complex_dotprod_sse.S, - src/lib/filter/complex_dotprod_sse64.S, - src/lib/filter/fcomplex_dotprod_3dnow.S, - src/lib/filter/fcomplex_dotprod_3dnow64.S, - src/lib/filter/fcomplex_dotprod_sse.S, - src/lib/filter/fcomplex_dotprod_sse64.S, - src/lib/filter/float_dotprod_3dnow.S, - src/lib/filter/float_dotprod_3dnow64.S, - src/lib/filter/float_dotprod_sse.S, - src/lib/filter/float_dotprod_sse64.S, - src/lib/filter/short_dotprod_mmx.S, - src/lib/filter/short_dotprod_mmx64.S: changed all occurrences of - .align 16 to .p2align 4 to avoid ambiguous interpretation of .align - argument. - - -2006-05-29 Eric Blossom - - * src/python/gnuradio/blksimpl/gmsk2_pkt.py: now uses string of 1's - and 0's for access_code representation. Refactored to use - correlate_access_code_bb and frame_sink_1 instead of packet_sink. - - * src/lib/general/gr_binary_slicer_fb.{h,cc,i}: new - * src/lib/general/gr_qpsk_slicer_cb.{h,cc,i}: deleted. Use - gr_constellation_decoder_cb instead. - -2006-05-29 Eric Blossom - - * src/lib/general/gr_clock_recovery_mm_cc.cc: revised - implementation based on G. R. Danesfahani, T.G. Jeans, - "Optimisation of modified Mueller and Muller algorithm," - Electronics Letters, Vol. 31, no. 13, 22 June 1995, pp. 1032 - 1033. - Thanks Tom! - - * src/utils/cool.m, src/utils/db_width.m, src/utils/filter_tools.m, - src/utils/read_char_binary.m, src/utils/read_complex_binary.m, - src/utils/read_float_binary.m, src/utils/read_int_binary.m, - src/utils/read_short_binary.m: modified to be compatible with - MATLAB. - -2006-05-26 Eric Blossom - - * src/lib/general/gr_framer_sink_1.{h,cc,i}: new. Refactored from - gr_packet_sink. Use in combination with gr_correlate_access_code_bb. - -2006-05-24 Eric Blossom - - * src/lib/general/gr_diff_encoder_bb.{h,cc,i}: new. differential encoder. - - * src/lib/general/gr_constellation_decoder_cb.{h,cc,i}: new. - Maps i/q value to closest constellation point and return value - associated with the point. This probably obsoletes - gr_qpsk_slicer_cb. - - * src/lib/general/gr_qpsk_slicer_cb.{h,cc,i}: new. - * src/lib/general/gr_unpack_k_bits_bb.{h,cc,i}: unpack bytes - containing k valid bits, into bytes, 1 bit per byte. - - * src/lib/general/gr_correlate_access_code_bb.{h,cc,i}: new. - General purpose block for searching for access codes (sync - vectors). Can handle any sync vector between 1 and 64 bits. - -2006-05-23 Eric Blossom - - * src/lib/general/gr_diff_phasor_cc.{h,cc,i}: new. Compute phase - difference as a complex number between adjacent complex items in - stream. This is useful for demodulating differentially encoded PSK. - - * src/python/gnuradio/gruimpl/mathmisc.py (log2): new function. - - * src/lib/general/gr_firdes.cc (root_raised_cosine): force ntaps - to be odd. - -2006-05-21 Martin Dudok van Heel - - Added generic test class gr_test. - gr_test is a gnuradio block meant to be used in a flow_graph. - It doesn't do much processing, but you can specify from python every parameter you need to for testing. - For example history, output_multiple, input and output signature, decimation and such. - Especially handy for testing setting up the buffers. - It also touches every available input and output to check for segfaults. - You can also instruct it to not consume all ninput_items or not produce all noutput_items. - - There is also a new script test_buffers.py in src/tests which uses gr_test to test setting up the buffers. - It is NOT automatically run by make check yet, because it will fail with an assert when it reaches circbuf memory limit of the system. - (On linux: Trying to setup a buffer >shmmax - Note that you can set the smmax limit manually on a linux 2.6 system in the following way in a root console) - #set shmmax limit manually to 300MB - echo 300000000 >/proc/sys/kernel/shmmax - - * src/lib/general/Makefile.am: added gr_test - * src/lib/general/general.i: added gr_test - * src/lib/general/gr_test.cc: new - * src/lib/general/gr_test.h: new - * src/lib/general/gr_test.i: new - * src/lib/general/gr_test_types.h: new - * src/tests/test_buffers.py: new script to test setting up the buffers using gr_test - -2006-05-21 Martin Dudok van Heel - - Solved the following bugs which result from incorrect buffersize setup: - sched: is requesting more input data - than we can provide. - ninput_items_required = 8192 - max_possible_items_available = 8191 - If this is a filter, consider reducing the number of taps. - - python: src/lib/runtime/gr_buffer.h:108: unsigned int gr_buffer::index_sub(unsigned int, unsigned int): - Assertion `(unsigned) s < d_bufsize' failed. - Aborted - - * src/python/gnuradio/gr/flow_graph.py: resolved above bugs by adding + mdown.history() to nitems when appropriate - -2006-04-24 Eric Blossom - - * src/lib/general/gr_chunks_to_symbols_XX.{h,cc,i}.t, - src/lib/general/gr_packed_to_unpacked_XX.{h,cc,i}.t, - src/lib/general/gr_unpacked_to_packed_XX.{h,cc,i}.t: - new pseudo-templates for generating family of blocks. Patch - submitted by Achilleas Anastasopoulos , touched - up by Eric. - -2006-04-24 Martin Dudok van Heel - - * src/python/gnuradio/gr/flow_graph.py (buffer_sizes.allocate): - increase buffer size allocation for blocks with a large - output_multiple, not just those that are decimators. - -2006-04-05 Eric Blossom - - * src/lib/general/gr_pll_carriertracking_cc.i: added - squelch_enable and set_lock_threshold methods. - - * src/lib/general/gr_clock_recovery_mm_cc.h: removed erroneous - class prefix to method. GCC 4.1.0 complains ;) - -2006-04-03 Eric Blossom - - * src/lib/general/gr_pll_carriertracking_cc.cc (phase_detector): - fixed typo. - - * src/python/gnuradio/gr/prefs.py: don't load prefs if - GR_DONT_LOAD_PREFS environment variable is set. run_tests sets - this to avoid interactions with system and user prefs during - make check. - - * src/python/gnuradio/gr/qa_rational_resampler.py: disabled two - tests that were causing hangs on SuSE 10.0. Should be investigated. - -2006-03-30 Eric Blossom - - * src/lib/filter/gr_fft_filter_ccc.{h,cc}, - src/lib/filter/gr_fft_filter_fff.{h,cc}: reworked to allow - safer setting of new taps after instantiation. - -2006-03-29 Eric Blossom - - * src/lib/general/gr_prefix.{h,cc,i}: new function that returns - installation prefix directory (--prefix argument to configure). - - * src/lib/general/gr_prefs.{h,cc,i}: reworked implementation to - use python ConfigParser. - * src/python/gnuradio/gr/prefs.py: moved from - src/python/gnuradio/prefs.py to solve initialization problem. - - * src/lib/general/gr_stream_to_vector.{h,cc,i}: renamed from gr_serial_to_parallel - * src/lib/general/gr_vector_to_stream.{h,cc,i}: renamed from gr_parallel_to_serial - * src/lib/python/gnuradio/gr/__init__.py: new aliases for - backwards compatibility with rename. - - * src/lib/swig/Makefile.am: cleanup for make distcheck. - - * src/lib/atsc/GrAtscBitTimingLoop.cc, GrAtscBitTimingLoop.h, - GrAtscBitTimingLoop2.cc, GrAtscBitTimingLoop2.h, - GrAtscBitTimingLoop3.cc, GrAtscBitTimingLoop3.h, - GrAtscConvert2xTo20.cc, GrAtscConvert2xTo20.h, - GrAtscDataSegToSoftDataSeg.cc, GrAtscDataSegToSoftDataSeg.h, - GrAtscDeinterleaver.cc, GrAtscDeinterleaver.h, - GrAtscDerandomizer.cc, GrAtscDerandomizer.h, - GrAtscEqualizer.cc, GrAtscEqualizer.h, GrAtscFPLL.cc, - GrAtscFPLL.h, GrAtscFieldSyncChecker.cc, - GrAtscFieldSyncChecker.h, GrAtscFieldSyncCorrelator.cc, - GrAtscFieldSyncCorrelator.h, GrAtscFieldSyncDemux.cc, - GrAtscFieldSyncDemux.h, GrAtscFieldSyncMux.cc, - GrAtscFieldSyncMux.h, GrAtscInterleaver.cc, - GrAtscInterleaver.h, GrAtscRSDecoder.cc, GrAtscRSDecoder.h, - GrAtscRSEncoder.cc, GrAtscRSEncoder.h, GrAtscRandomizer.cc, - GrAtscRandomizer.h, GrAtscSegSymSync.cc, GrAtscSegSymSync.h, - GrAtscSegSymSyncImpl.cc, GrAtscSegSymSyncImpl.h, - GrAtscSegSymSyncImpl_export.h, GrAtscSymbolMapper.h, - GrAtscTrellisEncoder.cc, GrAtscTrellisEncoder.h, - GrAtscViterbiDecoder.cc, GrAtscViterbiDecoder.h, Makefile.am, - README, atsc_basic_trellis_encoder.cc, - atsc_basic_trellis_encoder.h, atsc_consts.h, - atsc_data_interleaver.cc, atsc_data_interleaver.h, - atsc_diag_output.h, atsc_equalizer.cc, atsc_equalizer.h, - atsc_equalizer_lms.cc, atsc_equalizer_lms.h, - atsc_equalizer_lms2.cc, atsc_equalizer_lms2.h, - atsc_equalizer_nop.cc, atsc_equalizer_nop.h, atsc_exp2_lp.cc, - atsc_exp2_lp.h, atsc_exp2_lp20.dat, atsc_exp2_lp2x.dat, - atsc_fake_single_viterbi.cc, atsc_fake_single_viterbi.h, - atsc_fs_checker.cc, atsc_fs_checker.h, - atsc_fs_checker_naive.cc, atsc_fs_checker_naive.h, - atsc_fs_correlator.cc, atsc_fs_correlator.h, - atsc_fs_correlator_naive.cc, atsc_fs_correlator_naive.h, - atsc_pnXXX.cc, atsc_pnXXX.h, atsc_randomizer.cc, - atsc_randomizer.h, atsc_reed_solomon.cc, atsc_reed_solomon.h, - atsc_root_raised_cosine.cc, atsc_root_raised_cosine.h, - atsc_root_raised_cosine_bandpass.cc, - atsc_root_raised_cosine_bandpass.h, atsc_single_viterbi.cc, - atsc_single_viterbi.h, atsc_slicer_agc.h, - atsc_sliding_correlator.cc, atsc_sliding_correlator.h, - atsc_sssr.cc, atsc_sssr.h, atsc_syminfo.h, atsc_sync_tag.h, - atsc_trellis_encoder.cc, atsc_trellis_encoder.h, atsc_types.h, - atsc_viterbi_decoder.cc, atsc_viterbi_decoder.h, - atsc_viterbi_gen.cc, atsc_vsbtx_lp.cc, atsc_vsbtx_lp.dat, - atsc_vsbtx_lp.h, convolutional_interleaver.h, - create_atsc_equalizer.cc, create_atsc_equalizer.h, - create_atsc_fs_checker.cc, create_atsc_fs_checker.h, - create_atsc_fs_correlator.cc, create_atsc_fs_correlator.h, - fpll_btloop_coupling.h, gen_encoder.py, interleaver_fifo.h, - plinfo.cc, qa_atsc.cc, qa_atsc.h, - qa_atsc_basic_trellis_encoder.cc, - qa_atsc_basic_trellis_encoder.h, qa_atsc_data_interleaver.cc, - qa_atsc_data_interleaver.h, qa_atsc_equalizer_nop.cc, - qa_atsc_equalizer_nop.h, qa_atsc_fake_single_viterbi.cc, - qa_atsc_fake_single_viterbi.h, qa_atsc_fs_correlator.cc, - qa_atsc_fs_correlator.h, qa_atsc_randomizer.cc, - qa_atsc_randomizer.h, qa_atsc_reed_solomon.cc, - qa_atsc_reed_solomon.h, qa_atsc_single_viterbi.cc, - qa_atsc_single_viterbi.h, qa_atsc_sliding_correlator.cc, - qa_atsc_sliding_correlator.h, qa_atsc_trellis_encoder.cc, - qa_atsc_trellis_encoder.h, - qa_atsc_trellis_encoder_t1_input.dat, - qa_atsc_trellis_encoder_t1_output.dat, - qa_atsc_viterbi_decoder.cc, qa_atsc_viterbi_decoder.h, - qa_atsc_viterbi_decoder_t1_input.dat, - qa_atsc_viterbi_decoder_t1_output.dat, - qa_convolutional_interleaver.cc, - qa_convolutional_interleaver.h, qa_interleaver_fifo.cc, - qa_interleaver_fifo.h: Moved all atsc code from src/lib/atsc to - new gr-atsc CVS module. - - * src/lib/general/gri_ringbuffer.{h,cc}: removed. Use - gr_buffer/gr_buffer_reader instead. - -2006-03-27 Eric Blossom - - * src/lib/general/gr_prefs.{h,cc,i}: renamed parameter from "val" to - "v" to work around issue in SWIG 1.3.{28,29} and/or g++ 4.0.2. - - * src/lib/general/gr_prefs.{h,cc,i}, src/python/gnuradio/prefs.py: - new class for user preferences. This uses SWIG directors (serious - magic), to have the actual implementation be in python, but - callable transparently from C++. We'll use this for user prefs - such as audio module, audio module options, etc. - -2006-03-25 Eric Blossom - - * src/lib/io/gri_logger.h (class gri_logger): new class that can - safely log to a file from within a JACK or portaudio callback. - Uses a ringbuffer to communicate with a separate thread that - writes the file. - -2006-03-17 Eric Blossom - - * src/lib/runtime/gr_buffer.cc (gr_buffer_reader): added missing - drop_reader call to destructor. Fixed latent bug. - -2006-03-15 Eric Blossom - - * src/lib/omnithread.h, - src/lib/omnithread/ot_posix.h, src/lib/omnithread/posix.cc, - src/lib/omnithread/nt.cc: mods to - allow specifying a max count on semaphores. This allows the - construction of binary semaphores by passing max_count=1 to the ctor. - The default behavior is unchanged. - -2006-03-13 Eric Blossom - - * src/lib/general/gr_pll_carriertracking_cc.cc (work): refactored - loop control. - -2006-03-12 Stephane Fillod - * src/lib/general/gri_ringbuffer.{cc,h}, - src/lib/general/Makefile.am: new lockless ringbuffer (single - reader/single writer) taken from JACK software (GPL). - * * src/lib/omnithread/omnithread.h: add omni_mutex::trylock - * * src/lib/omnithread/ot_posix.h: POSIX trylock implementation - * * src/lib/omnithread/ot_nt.h: Win32 trylock implementation - -2006-03-12 Eric Blossom - - * src/lib/general/gr_firdes.h, src/lib/io/gr_file_source.h: Fix - for g++ 4.1. Removed extra class:: qualification. Patch - submitted by Martin Michlmayr - -2006-03-10 Eric Blossom - - * src/lib/general/gr_dd_mpsk_sync_cc.cc: doc fixes. reworked - delay line handling. - * src/lib/general/gr_dd_mpsk_sync_cc.h: doc fixes. Added DLLEN const. - * src/lib/general/gr_costas_loop_cc.h: doc fixes. - * src/lib/general/gr_costas_loop_cc.cc (work): cosmetic tweak to - loop control. - -2006-03-07 Eric Blossom - - * src/lib/general/gr_multiply_const_XX.h.t, - src/lib/general/gr_quadrature_demod_cf.h, - src/lib/general/gr_frequency_modulator_fc.h, - src/lib/general/gr_packed_to_unpacked_bb.h, - src/lib/general/gr_unpacked_to_packed_bb.h, - src/lib/general/gr_chunks_to_symbols_bf.h, - src/lib/general/gr_chunks_to_symbols_bc.h: doc fixs. - -2006-02-22 Martin Dudok van Heel - - Addded new blocks gr_single_pole_iir_filter_cc - gr_agc_cc - gr_phase_modulator_fc - Changed gr_single_pole_iir.h to make this work - Bugfix, to make make_check work again. - - * src/lib/filter/Makefile.am: Added gr_single_pole_iir_filter_cc - Added missing gr_single_pole_avg.h and gr_single_pole_rec.h (fix make check bug) - * src/lib/filter/filter.i: changed. Added gr_single_pole_iir_filter_cc - * src/lib/filter/gr_single_pole_iir.h: changed template to have - partial specialization for . Needed - because calculations and temporary variables have to be - gr_complexd in this special case - * src/lib/filter/gr_single_pole_iir_filter_cc.cc: new - * src/lib/filter/gr_single_pole_iir_filter_cc.h: new - * src/lib/filter/gr_single_pole_iir_filter_cc.i: new - * src/lib/general/Makefile.am: changed. Added gr_agc_cc, gr_phase_modulator_fc,gri_agc_cc - * src/lib/general/general.i: changed. Added gr_agc_cc, gr_phase_modulator_fc - * src/lib/general/gr_agc_cc.cc: new - * src/lib/general/gr_agc_cc.h: new - * src/lib/general/gr_agc_cc.i: new - * src/lib/general/gr_phase_modulator_fc.cc: new - * src/lib/general/gr_phase_modulator_fc.h: new - * src/lib/general/gr_phase_modulator_fc.i: new - * src/lib/general/gri_agc_cc.h: new - * src/lib/general/gri_agc_cc.i: new - * src/python/gnuradio/gr/Makefile.am: changed. Added qa_single_pole_iir_cc.py - * src/python/gnuradio/gr/qa_single_pole_iir_cc.py: new - -2006-02-17 Stephane Fillod - - * configure.ac, src/lib/filter/ccomplex_dotprod_generic.cc, - src/lib/filter/complex_dotprod_generic.cc, - src/lib/filter/generate_gr_fir_sysconfig.py, - src/lib/filter/generate_gr_fir_sysconfig_generic.py, - src/lib/filter/generate_gr_fir_util.py, - src/lib/filter/gr_fir_XXX.cc.t, - src/lib/filter/gr_fir_XXX_generic.cc.t, - src/lib/filter/gr_fir_ccc_simd.cc, - src/lib/filter/gr_fir_ccc_x86.cc, - src/lib/filter/gr_fir_ccf_simd.cc, - src/lib/filter/gr_fir_ccf_x86.cc, - src/lib/filter/gr_fir_fcc_simd.cc, - src/lib/filter/gr_fir_fcc_x86.cc, - src/lib/filter/gr_fir_fff_simd.cc, - src/lib/filter/gr_fir_fff_x86.cc, - src/lib/filter/gr_fir_fsf_simd.cc, - src/lib/filter/gr_fir_fsf_x86.cc, - src/lib/filter/gr_fir_scc_simd.cc, - src/lib/filter/gr_fir_scc_x86.cc, - src/lib/filter/gr_fir_sysconfig_x86.cc, - src/lib/filter/gri_mmse_fir_interpolator.cc, - src/lib/filter/gri_mmse_fir_interpolator_cc.cc, - src/lib/filter/sysconfig_x86.cc, - src/lib/general/gr_align_on_samplenumbers_ss.cc, - src/lib/general/gr_crc32.cc, - src/lib/general/gr_head.cc, - src/lib/general/gr_lfsr_32k_source_s.cc, - src/lib/general/gr_noise_source_X.cc.t, - src/lib/general/gr_nop.cc, - src/lib/general/gr_reverse.cc, - src/lib/general/gr_sig_source_X.cc.t, - src/lib/general/gr_simple_correlator.cc, - src/lib/general/gr_simple_framer.cc, - src/lib/general/gr_skiphead.cc, - src/lib/general/gr_vector_sink_X.cc.t, - src/lib/general/gr_vector_source_X.cc.t, - src/lib/general/qa_gr_fxpt.cc, - src/lib/general/qa_gr_fxpt_nco.cc, - src/lib/general/qa_gr_fxpt_vco.cc, - src/lib/io/gr_oscope_guts.cc, - src/lib/runtime/gr_io_signature.cc, - src/lib/runtime/gr_types.h, - src/lib/runtime/qa_gr_block.cc, - src/lib/runtime/qa_gr_buffer.cc, - src/lib/runtime/qa_gr_io_signature.cc: added proper config check - for stdint.h to define gr_int* types. - -2006-02-16 Eric Blossom - - * src/lib/runtime/gr_types.h: added typedef for gr_int64 and - gr_uint64. Need proper autoconf fix for these. - -2006-02-08 Eric Blossom - - * src/lib/io/gr_file_sink.{h,cc,i}: added new methods: enable & - disable. Thanks Marcus! - -2006-02-06 Eric Blossom - - * src/lib/general/gr_kludge_copy.{h,cc,i}: new. Copies input to output. - * src/python/gnuradio/gr/qa_kludge_copy.py: new QA code. - -2006-02-05 Eric Blossom - - * src/python/gnuradio/gr/qa_iir.py (test_iir.test_iir_direct_008): - accept either RuntimeError or ValueError in test case. The return - value changed in swig 1.3.28. - - * src/lib/swig/gnuradio.i: now use anonymous templates for - std::vector's. This was a tip from one of the SWIG developers. - It generates less code. - -2006-02-02 Eric Blossom - - * src/python/gnuradio/gruimpl/seq_with_cursor.py: added method to - select closest index by value. - -2006-01-30 Eric Blossom - - * src/lib/general/gr_packet_sink.{h,i}: Added new "carrier_sensed" - method. Naive implementation, but it just might work ;) - * src/python/gnuradio/blksimpl/gmsk2_pkt.py (carrier_sensed): new method. - -2006-01-28 Eric Blossom - - * src/lib/general/gr_pa_2x2_phase_combiner.{h,cc,i}: new. - four antenna phase combiner for phased array experiments. - - * src/lib/general/gr_simple_squelch_cc.{h,cc,i}: added threshold - and squelch_range methods. - -2006-01-24 Eric Blossom - - * src/lib/general/gr_sync_block.cc (forecast): removed duplicated code. - * src/lib/general/gr_sync_interpolator.cc (forecast): removed duplicated code. - * src/lib/general/gr_sync_decimation.cc (forecast): removed duplicated code. - * src/lib/runtime/gr_single_threaded_scheduler.cc (main_loop): - take advantage of fixed_rate() method so that we can consume all - available input. Fixed bad audio sound with encdec. - -2005-12-23 Eric Blossom - - * src/lib/general/gr_interleaved_short_to_complex.i (class - gr_interleaved_short_to_complex): corrected superclass spec. - -2005-12-19 Martin Dudok van Heel - - Addded a new blocks to convert from unsigned char to float and for char to float. - Added new agc block gr_agc_ff based on existing gr_agc block - (which can't be directly used in a flowgraph). All needed for - tv-reception. - - * src/lib/general/gr_uchar_to_float.{cc,h,i}: new - * src/lib/general/gri_uchar_to_float.{cc,h}: new - * src/lib/general/gr_char_to_float.{cc,h,i}: new - * src/lib/general/gri_char_to_float.{cc,h}: new - * src/lib/general/gr_agc_ff.cc: new - * src/lib/general/gr_agc_ff.h: new - * src/lib/general/gr_agc_ff.i: new - * src/lib/general/Makefile.am: changed. Added gr_agc_ff, - gr_(u)char_to_float and gri_(u)char_to_float. - * src/lib/general/general.i: changed. Added - gr_agc_ff,gr_(u)char_to_float and gri_(u)char_to_float. - -2005-12-17 Eric Blossom - - * src/lib/general/gr_quadrature_demod_cf.cc: use fast arctan code. - -2005-12-17 Bob McGwier N4HY - - * src/lib/general/gr_lms_dfe_cc.{h,cc,i}: new. - * src/lib/general/gr_fast_atan2f.cc: new. Fast arc tangent using - table lookup and interpolation. Declaration added to gr_math.h - -2005-12-17 Eric Blossom - - * src/lib/general/gr_lms_dfe_ff.h: doc fix. - * src/lib/general/gr_lms_dfe_ff.cc: refactored. Moved common - functions to gr_misc - * src/lib/general/gr_misc.{h,cc}: new. Collect misc functions in - one place. - * doc/Makefile.am: --enable-doxygen default is now "no" - -2005-12-16 Eric Blossom - - * src/lib/swig/gnuradio_swig_bug_workaround.h: removed from CVS. - It's generated when it's needed. - -2005-12-09 Eric Blossom - - made 2.6 release. - -2005-12-08 Chuck Swiger - - * src/lib/general/gr_probe_signal_f.{h,cc,i}: new. Return a - single sample from the stream. - -2005-12-07 Chuck Swiger - - * src/lib/general/gr_probe_avg_mag_sqrd_{f,c}.{h,cc,i}: new. - Sinks that measure the average magnitude squared and allow the - value to be retrieved via accessors. - -2005-12-06 Eric Blossom - - * src/lib/general/gr_clock_recovery_mm_ff.cc: doc fix: added reference to book. - -2005-12-01 Eric Blossom - - * src/lib/general/gr_packet_sink.h (class gr_packet_sink): changed - d_threshold to unsigned to eliminate warning. - * src/lib/general/gr_simple_correlator.cc: removed duplicate - definition of slice. - -2005-12-01 Stephane Fillod - - * src/lib/general/gr_count_bits.cc (gr_count_bits32): faster - implementation. No branching. - -2005-11-22 Ramakrishnan Muthukrishnan - - * src/python/gnuradio/gr/qa_filter_delay_fc.py, - src/python/gnuradio/gr/qa_hilbert.py: updated QA code to reflect - change in delay line handling. - -2005-11-21 Eric Blossom - - * config/gr_boost.m4: reworked to look for latest version if - installed in version-specific subdir of /usr/local/include. - * src/lib/swig/Makefile.am (DISTCLEANFILES): added gnuradio_swig_python.d - -2005-11-19 Eric Blossom - - * config/usrp_libusb.m4 (USRP_LIBUSB): add -lIOKit under darwin. - * config/gr_no_undefinedm4, config/gr_set_md_cpu.m4, - config/gr_x86_64.m3, config/usrp_fusb_tech.m4, - config/usrp_libusb.m4: changed incorrect use of - AC_CANONICAL_TARGET to HOST. - -2005-11-18 Eric Blossom - - These changes enabled discontinous transmission of usrp packets. - The treatment of history was slightly changed. Now we provide - zeros for the initial delay lines and produce N outputs for N - inputs. In the past we would produce N-history-1 outputs for N inputs. - - * src/python/gnuradio/packet_utils.py: ensure at least a single - byte of padding to flush filters. - * src/lib/runtime/gr_block.{h,cc,i}, - src/lib/general/gr_sync_block.{h,cc,i}, - src/lib/general/gr_sync_decimator.{h,cc,i}, - src/lib/general/gr_sync_interpolator.{h,cc,i}: moved history into - gr_block from gr_sync_block. Added new methods to support fast - path through scheduler: fixed_rate, fixed_rate_ninput_to_output - and fixed_rate_noutput_to_input. - - * src/python/gnuradio/gr/flow_graph.py (flow_graph._connect_inputs): - account for initial history when attaching buffer reader. - * src/lib/runtime/gr_buffer.{h,cc,i} (gr_buffer_add_reader): modified to - provide zeros for initial history. - - * src/python/gnuradio/gr/qa_fft_filter.py, - src/python/gnuradio/gr/qa_filter_delay_fc.py, - src/python/gnuradio/gr/qa_hilbert.py, - src/python/gnuradio/gr/qa_interp_fir_filter.py, - src/python/gnuradio/gr/qa_rational_resampler.py: tweaked QA code - to work with new history behavior. - - -2005-11-17 Eric Blossom - - * src/lib/filter/gr_interp_fir_filter_XXX.cc.t, - gr_rational_resampler_base_XXX.cc.t: ensure that history is set in - constructor. - - * src/lib/runtime/gr_msg_queue.i: more evil hackery to release - Python global interpreter lock around blocking msg_queue methods. - - * src/python/gnuradio/packet_utils.py (make_packet): conditionally - add padding such that final packet is a multiple of 512 bytes on the USB. - -2005-11-16 Eric Blossom - - * src/lib/io/gr_message_source.h (class gr_message_source): added - msgq limit to constructor args. - - * src/lib/general/gr_packet_sink.{h,cc,i}: added access code - detection threshold to ctor args. - - * src/lib/filter/gri_mmse_fir_interpolator.{h,cc}: declared interpolate const. - - * src/lib/general/gr_clock_recovery_mm_ff.cc: limit excursions of - omega using omega_relative_limit. Added conditional diagnostic logging. - - * src/lib/runtime/gr_msg_queue.{h,cc}: block when inserting into a - full msg queue. - - * src/lib/filter/gr_fractional_interpolator.cc (general_work): - 1.0 - d_mu -> d_mu to match revised filter defs. - -2005-11-15 Eric Blossom - - * src/lib/io/gr_oscope_guts.{h,cc}, - src/lib/io/gr_oscope_sink_f.{h,cc,i}: Refactored to use messages - and message queues to communicate to Python. This code will never - block waiting for the gui. - * src/lib/io/gr_message_sink.{h,cc,i}: new. A sink that packages up its - input and puts it in a message queue. - -2005-11-14 Eric Blossom - - * doc/Doxyfile.in: updated to latest version. Turned off serveral - options to reduce documentation generation time. - -2005-11-13 Eric Blossom - - * src/python/gnuradio/blksimpl/gmsk2.py, - src/python/gnuradio/blksimpl/gmsk2_pkt.py: new GMSK mod/demod. - * src/python/gnuradio/gruimpl/mathmisc.py: new: gcd, lcm. - * src/python/gnuradio/blksimpl/rational_resampler.py: If neither - taps nor fractional_bw is supplied, provide a reasonable default. - -2005-11-11 Eric Blossom - - * src/lib/filter/qa_gri_mmse_fir_interpolator.cc (t1): revised sign. - - * src/lib/filter/gr_fir_filter_XXX.cc.t (work): if taps updated, return 0. - * src/lib/filter/gr_interp_fir_filter_XXX.cc.t (work): if taps updated, return 0. - -2005-11-09 Matt Ettus - - * src/lib/general/gr_packet_sink.cc (gr_make_packet_sink): new. - slices, correlates for packet access code, checks header and - assembles packets. - -2005-11-09 Eric Blossom - - * src/lib/io/gr_message_source.h: new class. Messages sent to - this class are streamed to its single output. - - * src/lib/runtime/gr_message.{h,cc,i}: removed unused methods; new - constructor from string; get contents as string. - - * src/lib/filter/gri_mmse_fir_interpolator.{h,cc}: renamed from gr_mmse_fir_interpolator. - * src/lib/filter/gr_fractional_interpolator.{h,cc,i}: new. - -2005-11-08 Eric Blossom - - * src/lib/general/gr_crc32.{h,cc,i}: new. ISO 3309 CRC-32 generator. - -2005-11-08 Matt Ettus - - * src/lib/general/gr_threshold_ff.{h,cc,i}: new. - * src/python/gnuradio/blksimpl/standard_squelch.py: new - * src/python/gnuradio/blksimpl/nbfm_rx.py: removed squelch from - block. - -2005-11-07 Eric Blossom - - * src/python/gnuradio/blksimpl/rational_resampler.py - (design_filter): added code to automatically design filter. - - * src/lib/general/gr_firdes.cc (window): fixed Kaiser window. - -2005-10-28 Eric Blossom - - * src/lib/io/gr_oscope_sink_f.cc (gr_oscope_sink_f): fixed del of - unowned variable that was causing double-free. - -2005-10-23 Eric Blossom - - * src/lib/general/gr_nco.h (gr_nco): removed unused local var. - -2005-10-17 Eric Blossom - - * src/lib/general/gr_fxpt_vco.h: use floats instead of double. - Gives 30% speedup on Opteron under gcc 3.3.5 - -2005-10-17 Stephane Fillod - - * src/lib/general/gr_fxpt_nco.h, src/lib/general/gr_nco.h, - src/lib/general/gr_sig_source_X.cc.t: set primitives in shape - for an eventual simd speedup. fix bug in sincos() of gr_nco.h. - - * src/lib/general/Makefile.am, src/lib/general/gr_vco.h, - src/lib/general/gr_vco_f.cc, src/lib/general/gr_vco_f.h, - src/lib/general/qa_gr_fxpt_vco.h, src/lib/general/qa_gr_fxpt_vco.cc, - src/lib/general/qa_general.cc, src/tests/benchmark_vco.cc, - src/lib/general/gr_fxpt_vco.h: make use of fixed point cosine for VCO, - with appropriate QA code, set primitives in shape for an eventual - simd speedup. - * src/lib/general/qa_gr_fxpt_vco.cc, src/lib/general/gr_vco.h, - src/lib/general/qa_gr_fxpt_vco.h, src/lib/general/gr_fxpt_vco.h: new - - * README: reference gr-audio-jack, gr-audio-windows and gr-comedi - -2005-10-12 Eric Blossom - - * src/lib/runtime/gr_vmcircbuf_mmap_tmpfile.{h,cc}: resurrected - rev 1.1 then added check for contiguous mapping. - * src/lib/runtime/gr_vmcircbuf.cc: enable gr_vmcircbuf_mmap_tmpfile. - -2005-10-11 Eric Blossom - - * src/lib/runtime/gr_vmcircbuf_mmap_shm_open.cc - (gr_vmcircbuf_mmap_shm_open): corrected error message. - -2005-10-10 Eric Blossom - - * src/lib/runtime/gr_vmcircbuf_mmap_tmpfile.{h,cc}: removed. - -2005-10-10 Stephane Fillod - - * src/lib/general/gr_check_counting_s.cc, - src/lib/general/gr_check_lfsr_32k_s.cc, - src/lib/general/gr_vector_source_X.cc.t, - src/lib/runtime/gr_vmcircbuf_createfilemapping.cc, - src/lib/runtime/gr_vmcircbuf_mmap_shm_open.cc: compiler warning - silencing. - - * src/lib/general/gr_sig_source_X.cc.t, - src/lib/general/gr_fxpt_nco.h, - src/lib/general/gr_nco.h: added sincos block primitive. - * src/lib/general/qa_gr_fxpt_nco.cc: qa code for new sincos - block primitive. cleanup. - * src/tests/benchmark_nco.cc: benchmark the new sincos block - - * src/tests/Makefile.am: added benchmark_vco - src/tests/benchmark_vco.cc: new - -2005-10-05 Eric Blossom - - * src/python/gnuradio/gr/hier_block.py (hier_block_base.__init__): - reenabled weakref to break circular graph. - * src/python/gnuradio/gr/basic_flow_graph.py (basic_flow_graph), - src/python/gnuradio/gr/flow_graph.py (flow_graph): - removed __slots__ class attribute so we can create weakrefs to - flow graphs. - - * src/python/gnuradio/gr/gr_threading.py: New. Load appropriate bug fix. - * src/python/gnuradio/gr/gr_threading_23.py (Thread.join): bug fixed - version of python 2.3 threading.py. - * src/python/gnuradio/gr/gr_threading_24.py (Thread.join): bug fixed - version of python 2.4 threading.py. - - * src/lib/general/gr_vco_f.{h,cc,i}: new VCO block. - -2005-10-03 Eric Blossom - - * src/python/gnuradio/gr/hier_block.py (hier_block_base.__init__): - backed out use of weakref. - * src/python/gnuradio/gr/scheduler.py (scheduler.wait): backed out - "Control-C fix". - -2005-10-02 Eric Blossom - - * src/python/gnuradio/blksimpl/wfm_tx.py: New. Wide band FM tx block. - -2005-09-29 Eric Blossom - - * src/python/gnuradio/gr/hier_block.py (hier_block_base.__init__): - store weakref to flow_graph to break circular graph so that flow - graph can be reclaimed right away. - - * src/python/gnuradio/gr/flow_graph.py (flow_graph.__del__): call - self.stop() to ensure that i/o devices get shutdown gracefully. - - * src/python/gnuradio/gr/scheduler.py (scheduler.wait): calling - thread.join was keeping us from seeing SIGINT. Replaced with - alternate implementation. - -2005-09-27 Eric Blossom - - * src/python/gnuradio/eng_option.py (check_subdev): removed the - (0, None) and (1, None) results. - -2005-09-21 Eric Blossom - - * src/python/gnuradio/eng_option.py (check_subdev): added new - command line parser type, "subdev", for selecting usrp daughterboards. - -2005-09-17 Krzysztof Kamieniecki - - * src/lib/filter/qa_gr_fir_ccf.cc: alignment fix for gcc 4.x - -2005-08-28 Stephane Fillod - - * config/gr_set_md_cpu.m4, src/lib/filter/Makefile.am: add simd - support for x86_64 platform. - - * src/lib/filter/ccomplex_dotprod_3dnow64.S, - src/lib/filter/ccomplex_dotprod_3dnowext64.S, - src/lib/filter/ccomplex_dotprod_sse64.S, - src/lib/filter/complex_dotprod_3dnow64.S, - src/lib/filter/complex_dotprod_3dnowext64.S, - src/lib/filter/complex_dotprod_sse64.S, - src/lib/filter/fcomplex_dotprod_3dnow64.S, - src/lib/filter/fcomplex_dotprod_sse64.S, - src/lib/filter/float_dotprod_3dnow64.S, - src/lib/filter/float_dotprod_sse64.S, - src/lib/filter/short_dotprod_mmx64.S, - src/lib/filter/cpuid_x86_64.S: new - - * src/lib/filter/ccomplex_dotprod_3dnow.S, - src/lib/filter/ccomplex_dotprod_3dnowext.S, - src/lib/filter/ccomplex_dotprod_sse.S, - src/lib/filter/complex_dotprod_3dnow.S, - src/lib/filter/complex_dotprod_3dnowext.S, - src/lib/filter/complex_dotprod_sse.S, - src/lib/filter/fcomplex_dotprod_3dnow.S, - src/lib/filter/fcomplex_dotprod_sse.S, - src/lib/filter/float_dotprod_3dnow.S, - src/lib/filter/float_dotprod_sse.S, - src/lib/filter/short_dotprod_mmx.S - src/lib/filter/cpuid_x86.S: filename debug info fix, - removed useless emms instruction in pure SSE. - * src/lib/filter/qa_gr_fir_ccc.cc: comment fix - -2005-08-28 Eric Blossom - - * src/lib/general/malloc16.c: fixed 64-bit pointer to int cast problem. - -2005-08-26 Eric Blossom - - * src/python/gnuradio/gr/qa_rational_resampler.py - (test_rational_resampler.test_002_interp): reduced random test - from 10k cases to 1000 cases. The 10k case turns up a single - failure. FIXME figure out why! - - * src/python/gnuradio/gr/qa_fsk_stuff.py - (test_bytes_to_syms.test_simple_framer): fixed test case to - reflect 0x55 trailing tail. - - * src/lib/filter/qa_gr_fir_ccc.cc (test_random_io): Ensure 16-byte - input alignment to meet contract with SIMD ccc kernel. - -2005-08-25 Eric Blossom - - * src/lib/general/gr_simple_correlator.cc: average the samples in - the sync field and use this to set the slicing level for the - payload. This helps account for frequency offsets between the Tx - and Rx sides. - -2005-08-24 Eric Blossom - - * src/lib/general/gr_simple_framer_sync.h: include GRSF_TAIL_PAD - in GRSF_OVERHEAD. - - * src/lib/runtime/gr_single_threaded_scheduler.cc (main_loop): now - only invoke sources if we are not making progress. This avoids - blocking (in most cases) unless we've got nothing better to do. - - * src/lib/filter/gr_freq_xlating_fir_filter_XXX.cc.t - (build_composite_fir): reversed taps to fix problem introduced - when we "rationalized" the tap ordering a while ago. [We are - missing a unit test for this...] - -2005-08-22 Matt Ettus - - * src/python/gnuradio/blksimpl/gmsk.py: - made several changes to the filters on both TX and RX. - The demod filter (integrate_taps) should not average - over multiple samples. In reality, a few samples should - work, so I'm not sure why it doesn't here. - -2005-08-22 Eric Blossom - - * src/lib/general/gr_simple_correlator.cc (general_work): removed - incorrect magic number and replaced with constant expression. - [Almost as embarrassing as a buffer overflow] - -2005-08-21 Eric Blossom - - * src/lib/general/gr_simple_framer_sync.h: added one byte tail - padding to ensure that correlator has a chance to get synced in - case it was later on the previous packet. - - * src/lib/general/gr_simple_correlator.cc (general_work): - corrected to use count_bits64. - -2005-08-19 Eric Blossom - - * doc/Makefile.am: clean-local now uses $(RM) -fr - -2005-08-18 Eric Blossom - - * src/lib/general/gr_count_bits.{h,cc}: new gr_count_bits64. - - * src/lib/general/gr_simple_correlator.{h,cc}, - src/lib/general/gr_simple_framer.{h,cc}, - src/lib/general/gr_simple_framer_sync.h, - src/python/gnuradio/gr/qa_fsk_stuff.py: changed length of SYNC - code from 32 to 64 bits. - -2005-08-16 Andrew Thomas Beck - - * src/lib/runtime/gr_vmcircbuf_createfilemapping.cc (gr_vmcircbuf_createfilemapping): fixes. - -2005-08-15 Eric Blossom - - * src/lib/runtime/gr_single_threaded_scheduler.i, - src/lib/runtime/gr_block_detail.i, src/lib/runtime/gr_buffer.i: - fixes for SWIG 1.3.25. Thanks to Job de Haas for a big clue! - -2005-08-08 Martin Dudok van Heel - - Addded a new block to convert from float to unsigned char. Needed for new tv-reception example. - - * src/lib/general/gr_float_to_uchar.{cc,h,i}: new - * src/lib/general/gri_float_to_uchar.{cc,h}: new - * src/lib/general/Makefile.am: changed. Added gr_float_to_uchar and gri_float_to_uchar. (Also added gr_float_to_char.h which was - forgotten in previous patch to add gr_float_to_char) - * src/lib/general/general.i: changed. Added gr_float_to_uchar and gri_float_to_uchar. - -2005-07-28 Eric Blossom - - * src/lib/general/qa_gr_circular_file.cc (t1): conditionalized - base on HAVE_MMAP. - -2005-07-24 Stephane Fillod - - * src/lib/runtime/gr_vmcircbuf_mmap_tmpfile.cc: get correct - granularity under Cygwin. - - * src/lib/filter/Makefile.am: renamed .s files to .S in order - to enable preprocessor support in assembly source - * src/lib/general/README: misc status update - * src/lib/filter/assembly.h: new - * src/lib/filter/3dnow_float_dotprod_really_simple.S, - src/lib/filter/3dnow_float_dotprod_simple.S, - src/lib/filter/ccomplex_dotprod_3dnow.S, - src/lib/filter/ccomplex_dotprod_3dnowext.S, - src/lib/filter/ccomplex_dotprod_sse.S, - src/lib/filter/complex_dotprod_3dnow.S, - src/lib/filter/complex_dotprod_3dnowext.S, - src/lib/filter/complex_dotprod_sse.S, - src/lib/filter/fcomplex_dotprod_3dnow.S, - src/lib/filter/fcomplex_dotprod_sse.S, - src/lib/filter/float_dotprod_3dnow.S, - src/lib/filter/float_dotprod_sse.S, - src/lib/filter/short_dotprod_mmx.S, - src/lib/filter/cpuid_x86.S: new, moved from .s files with - added preprocessor macros to handle both ELF and Windows - x86 assembly. - * src/lib/filter/3dnow_float_dotprod_really_simple.s, - src/lib/filter/3dnow_float_dotprod_simple.s, - src/lib/filter/ccomplex_dotprod_3dnow.s, - src/lib/filter/ccomplex_dotprod_3dnowext.s, - src/lib/filter/ccomplex_dotprod_sse.s, - src/lib/filter/complex_dotprod_3dnow.s, - src/lib/filter/complex_dotprod_3dnowext.s, - src/lib/filter/complex_dotprod_sse.s, - src/lib/filter/fcomplex_dotprod_3dnow.s, - src/lib/filter/fcomplex_dotprod_sse.s, - src/lib/filter/float_dotprod_3dnow.s, - src/lib/filter/float_dotprod_sse.s, - src/lib/filter/short_dotprod_mmx.s, - src/lib/filter/cpuid_x86.s: removed (renamed) - - -2005-07-21 Eric Blossom - - * src/lib/filter/gr_fft_filter_fff.cc (compute_sizes): turned off - debugging output. - -2005-07-20 Eric Blossom - - * src/python/gnuradio/blksimpl/filterbank.py: documented channel - number to frequency mapping. Fixed a couple of problems related - to reversing filter tap order. - -2005-07-20 Martin Dvh - - * src/lib/runtime/gr_vmcircbuf_createfilemapping.{h,cc}: new. - Native implementation for Windows NT/W2K/XP. - * config/gr_python.m4: MinGW mods. - -2005-07-19 Eric Blossom - - * src/lib/filter/gr_fft_filter_fff.{h,cc,i}: new. Work in - progress. Not yet ready for prime time. - - * src/lib/runtime/gr_single_threaded_scheduler.cc: fixed spinning when - sink's upstream was done, but there was a non-zero but too small - amount of data left in the sink's input buffer. - -2005-07-18 Stephane Fillod - - * config/gr_libgnuradio_core_extra_ldflags.m4, - config/gr_no_undefined.m4, config/gr_python.m4: mods for MinGW. - -2005-07-17 Eric Blossom - - * src/lib/filter/gr_rational_resampler_base_XXX.{h,cc,i}: new. - - * src/python/gnuradio/blksimpl/rational_resampler.py - (rational_resampler_ccc.__init__): new. High-level wrapper for - gr.rational_resampler_base_??? - -2005-07-15 Eric Blossom - - * src/lib/filter/gr_fft_filter_ccc.cc, src/lib/filter/gr_fir_XXX.h.t, - src/lib/filter/gr_fir_ccc_simd.cc, src/lib/filter/gr_fir_ccc_simd.h, - src/lib/filter/gr_fir_ccf_simd.cc, src/lib/filter/gr_fir_ccf_simd.h, - src/lib/filter/gr_fir_fcc_simd.cc, src/lib/filter/gr_fir_fcc_simd.h, - src/lib/filter/gr_fir_fff_simd.cc, src/lib/filter/gr_fir_fsf_simd.cc, - src/lib/filter/gr_fir_scc_simd.cc, src/lib/filter/gr_fir_scc_simd.h, - src/lib/filter/gr_hilbert_fc.cc, src/lib/filter/gr_interp_fir_filter_XXX.cc.t, - src/lib/filter/gr_mmse_fir_interpolator.cc, src/lib/filter/qa_ccomplex_dotprod_x86.cc, - src/lib/filter/qa_gr_fir_ccc.cc, src/lib/filter/qa_gr_fir_ccf.cc, - src/lib/filter/qa_gr_fir_fcc.cc, src/lib/filter/qa_gr_fir_fff.cc, - src/lib/filter/qa_gr_fir_scc.cc, src/lib/general/Makefile.am, - src/lib/general/gr_firdes.cc, src/lib/general/gr_firdes.h, - src/lib/general/gr_firdes.i, src/python/gnuradio/gr/qa_filter_delay_fc.py, - src/python/gnuradio/gr/qa_interp_fir_filter.py: reversed order of - "taps" arguments constructors and set_taps, fixed taps() so it - returns the right order. We now require the "right" order for - taps, instead of the reversed order ("dot product order") we used to - require. - -2005-07-13 Martin Dvh - - * config/gr_check_createfilemapping.m4, - config/gr_libgnuradio_core_extra_ldflags.m4: new files - * configure.ac, config/Makefile.am, src/lib/Makefile.am: added - support for extra ld flags and future createfilemapping - factory. - * src/lib/io/gr_file_source.cc, src/lib/io/gr_file_sink.cc: - binary mode support under Windows. - -2005-07-02 Eric Blossom - - * config/gr_no_undefined.m4, config/gr_x86_64.m4: new, x86_64 support. - * config/gr_python.m4: backed out search for libpython, making - x86_64 work and breaking Cygwin/MinGW. - * configure.ac, src/lib/Makefile.am: mods for x86_64, $(NO_UNDEFINED) - - * src/python/gnuradio/gr/qa_complex_to_xxx.py: loosened up passing - threshold so that we pass on x86_64. - -2005-06-23 Eric Blossom - - * src/lib/runtime/gr_error_handler.cc: added #include - -2005-06-19 Eric Blossom - - * src/lib/runtime/gr_single_threaded_scheduler.cc (main_loop): - added diagnostic logging. Fixed problem where data was dribbling - through pipeline. - - * src/lib/general/gr_fxpt.cc: gcc 4.x fix. - -2005-06-16 Eric Blossom - - * src/lib/general/gr_nco.h: increase precision: float->double. - * src/lib/general/qa_gr_fxpt_nco.h: changed initial test frequency - -2005-06-16 Stephane Fillod - - * gnuradio-core.pc.in, src/lib/Makefile.am, src/lib/atsc/Makefile.am, - src/lib/filter/Makefile.am, src/lib/general/Makefile.am, - src/lib/runtime/Makefile.am, src/tests/Makefile.am: put qa code - in separate library. - -2005-06-12 Eric Blossom - - * src/python/gnuradio/blksimpl/filterbank.py: new. DFT filterbank. - * src/lib/general/gr_vector_to_streams.{h,cc,i}: new. - * src/lib/general/gr_streams_to_vector.{h,cc,i}: new. - * src/lib/general/gr_streams_to_stream.{h,cc,i}: new. Convert - streams of 1 item into a stream of N items. - * src/lib/general/gr_stream_to_streams.{h,cc,i}: new. Convert - a stream of N items into N streams of 1 items. - -2005-06-11 Eric Blossom - - * src/lib/general/gr_nlog10_ff.{h,cc,i}: added addition constructor arg, - k, that is added to the return value. Handy for normalizing FFTs. - - * src/lib/filter/gr_fft_filter_ccc.{h,cc,i}: new. FFT based FIR filtering. - -2005-06-10 Eric Blossom - - * src/python/gnuradio/gr/flow_graph.py (buffer_sizes.allocate), - src/python/gnuradio/gr/basic_flow_graph.py (downstream_verticies_port): - modified to take into account downstream block decimation ratio. - This allows us to compute big FFTs, FIRs with lots of taps, etc. - -2005-05-18 Eric Blossom - - * src/lib/runtime/gr_block.{h,cc,i}: new start/stop methods. These are - useful for minimizing latency due to startup overhead. - * src/lib/runtime/gr_single_threaded_scheduler.cc: call new methods. - -2005-05-18 John Gilmore - - * src/python/gnuradio/gruimpl/hexint.py: new. Convert hex - constants to negative ints for long ints >= 2**31. - -2005-05-11 Eric Blossom - - * src/lib/runtime/gr_vmcircbuf_sysv_shm.cc - (gr_vmcircbuf_sysv_shm): add read-only guard page on either side - of buffer. - - * src/lib/general/gr_throttle.{h,cc,i}: new block to rate-limit - samples. Mostly useful where there's nothing stopping us from - sucking down all CPU. E.g., reading from files, gr.sig_source, etc. - -2005-05-09 Stephane Fillod - - * src/lib/filter/fcomplex_dotprod_{3dnow,sse}.s, - src/lib/filter/fcomplex_dotprod_x86.h, - src/lib/filter/gr_fir_ccf_simd.{cc,h}, - src/lib/filter/gr_fir_ccf_x86.{cc,h}, - src/lib/filter/gr_fir_fcc_simd.{cc,h}, - src/lib/filter/gr_fir_fcc_x86.{cc,h}, - src/tests/benchmark_dotprod_ccf.cc, - src/tests/benchmark_dotprod_fsf.cc: new files - * src/lib/filter/Makefile.am, src/tests/Makefile.am, - src/lib/filter/gr_fir_sysconfig_x86.{cc,h}: support for FCC and - CCF filter speedup - * src/tests/benchmark_dotprod_{ccc,fcc,scc}.cc: copy/paste fixes - which should not change benchmark results - -2005-05-09 Stephane Fillod - - * config/gr_sysv_shm.m4: SysV shared memory not mandatory - * config/gr_pwin32.m4, config/gr_python.m4, config/lf_cxx.m4: - fixes for Cygwin, MinGW - * src/lib/runtime/gr_error_handler.cc, src/lib/runtime/gr_local_sighandler.{h,cc}, - src/lib/runtime/gr_vmcircbuf.cc, src/lib/runtime/gr_vmcircbuf_mmap_tmpfile.cc: - modifications for Cygin, MinGW - -2005-04-27 Eric Blossom - - * src/lib/general/gr_fake_channel_coder_pp.{h,cc,i}: new classes - the pretend to do channel encoding and decoding, but really only - add and strip padding... - - * src/lib/runtime/gr_buffer.cc (allocate_buffer): cleaned up formatting - on allocation warning message. - - * src/python/gnuradio/blksimpl/digital_voice.py: GSM vocoder + GMSK. - -2005-04-03 Eric Blossom - - * src/lib/io/gr_oscope_guts.cc (found_trigger): fixed trigger - problem where value was exactly equal to trigger value. - -2005-03-29 Eric Blossom - - * src/python/gnuradio/blksimpl/gmsk.py: new GMSK mod and demod - from Joshua Lackey - -2005-03-29 Ramakrishnan Muthukrishnan - - * src/lib/filter/gr_filter_delay_fc.{h,cc,i}, - src/python/gnuradio/gr/qa_filter_delay_fc.py: New block that - pairs a filter with a delay. - -2005-03-26 Eric Blossom - - * src/lib/runtime/gr_dispatcher.{h,cc,i}, - src/lib/runtime/gr_select_handler.{h,cc,i}: new. Framework for - callbacks based on select(2). - - * src/lib/runtime/gr_error_handler.{h,cc,i}: new. - -2005-03-14 Eric Blossom - - * src/lib/general/gr_complex_to_xxx.{h,cc,i}: now support - vector length argument, vlen. - * src/lib/general/gr_nlog10_ff.{h,cc,i}: new. - * src/lib/general/gr_parallel_to_serial.{h,cc,i}: new. - * src/lib/filter/gr_single_pole_iir_filter_ff.{h,cc,i}: new - * src/python/gnuradio/gr/qa_single_pole_iir.py: new - * src/python/gnuradio/gr/qa_nlog10.py: new - -2005-03-08 Eric Blossom - - * src/python/gnuradio/gr/qa_fsk_stuff.py: enabled simple_framer qa code. - * src/lib/general/gr_simple_framer.{h,cc}: added forecast method. - -2005-03-07 Eric Blossom - - * configure.ac: test for trunc and work around if missing. - -2005-03-02 Eric Blossom - - * src/python/gnuradio/blks/__init__.py, src/python/gnuradio/blksimpl/__init__.py, - src/python/gnuradio/gru/__init__.py, - src/python/gnuradio/gruimpl/__init__.py: refactored organization - so that hierarchical blocks are physically contained in the - blkimpl directory, but that for convenience in naming, all blocks - appear in the gnuradio.blks package. Same story for gruimpl vs gru. - - Rearranged a bunch of stuff under src/python. CVS sucks! - -2005-02-28 Eric Blossom - - * src/lib/general/gr_frequency_modulator_fc.cc (work): fixed - floating point loss of precision. - * src/lib/general/gr_simple_correlator.cc (general_work): fixed - bug that had it processing only a single sample at a time. - -2005-02-25 Matt Ettus - - * lib/general/Makefile.am, lib/general/general.i, - lib/general/gr_rms_[ff,cf].[cc,h,i]: new rms measuring block - -2005-02-25 Eric Blossom - - * python/gnuradio/gr/qa_mute.py, lib/general/gr_mute_XX.cc.t, - lib/general/gr_mute_XX.h.t, lib/general/gr_mute_XX.i.t: new block. - * lib/general/Makefile.am, lib/general/Makefile.gen, - lib/general/general_generated.i, lib/general/generate_common.py: - mods to generate new block. - -2005-02-23 Eric Blossom - - * src/python/gnuradio/gr/hier_block.py: new. support for - hierarchical signal processing blocks. - * src/python/gnuradio/gr/basic_flow_graph.py, - src/python/gnuradio/gr/qa_basic_flow_graph.py: modified to support - hierarchical signal processing blocks. - -2005-02-22 Eric Blossom - - * src/lib/general/gr_simple_squelch_cc.{h,cc,i}: new. - - * src/lib/runtime/gr_message.{h,cc,i}, - src/lib/runtime/gr_msg_handler.{h,cc,i}, - src/lib/runtime/gr_msg_queue.{h,cc,i}, - src/lib/runtime/gr_timer.h: new. work-in-progress. - -2005-02-09 Eric Blossom - - * src/lib/io/gr_file_descriptor_source.{h,cc}(work): reworked to - return as soon as any data is available. This make it much more - friendly for reading sockets, named pipes, etc. - -2005-02-07 Eric Blossom - - * src/python/gnuradio/gr/basic_flow_graph.py (coerce_endpoint): - fix exception message. - -2005-02-06 Eric Blossom - - * src/python/gnuradio/gr/basic_flow_graph.py - (basic_flow_graph.connect): connect now takes >= 2 args, per - Thomas Traber's suggestion. - * src/python/gnuradio/gr/qa_flow_graph.py, - src/python/gnuradio/gr/qa_basic_flow_grapy.py: additional test code. - -2005-02-05 Eric Blossom - - * src/python/gnuradio/gr/basic_flow_graph.py - (basic_flow_graph.connect): removed unnecessary None - -2005-02-02 Chuck Swiger - - * src/lib/io/gr_file_source.{h,cc,i}: added seek method. - -2005-01-29 Eric Blossom - - * src/lib/runtime/gr_io_signature.i: mods for SWIG 1.3.24 - -2005-01-24 Eric Blossom - - * src/python/gnuradio/freqz.py (freqz): New. Compute frequency - response of filter. - * src/python/gnuradio/gnuplot_freqz.py: New. Plot output of freqz. - -2005-01-17 Eric Blossom - - * src/lib/runtime/gr_single_threaded_scheduler.cc (main_loop): - Make better initial estimate of noutput_items when current block - is a decimator. Removed old diagnostic code. - - * src/lib/general/gr_vector_source_X.cc.t (work): reorganized the - repeat case so that we always return the number of items requested. - This fixes the excessive latency we were seeing in - spectrum_inversion.py - - * src/python/gnuradio/gr/flow_graph.py: Set noutputs correctly. - * src/python/gnuradio/gr/qa_flow_graph.py: Test value of noutputs. - -2005-01-16 Eric Blossom - - * src/lib/runtime/gr_single_threaded_scheduler.cc (main_loop): - check for situation where block is requesting more input data than - we will ever provide. - - * src/python/gnuradio/gr/flow_graph.py (buffer_sizes.allocate): - set minimum buffersize to 2 * output_multiple() - - * src/lib/runtime/gr_buffer.cc (space_available): fixed degenerate - case to be consistent with normal case. - -2005-01-01 Eric Blossom - - * src/lib/io/sdr_1000.i (class sdr_1000_base): removed default arg - to work around SWIG 1.3.23 bug. - -2004-12-22 Eric Blossom - - * src/lib/general/qa_gr_fxpt.cc (t0): disabled float_to_fixed test - to avoid spurious failures. - -2004-12-21 Eric Blossom - - * src/lib/general/gr_fxpt.h (class gr_fxpt): added explicit float cast. - * src/lib/general/Makefile.am (grinclude_HEADERS): added gr_fxpt_nco.h - -2004-12-18 Eric Blossom - - * src/lib/general/gr_fxpt.{h,cc},src/lib/general/gr_fxpt_nco.{h,cc}, - src/lib/general/qa_gr_fxpt.{h,cc},src/lib/general/qa_gr_fxpt_nco.{h,cc}, - src/tests/benchmark_nco.cc: new. Faster sine and cosine - calculation. Uses table lookup with linear interpolation. This - is about 3x faster than the original code. - -2004-12-17 Eric Blossom - - * src/lib/general/Makefile.am (swiginclude_HEADERS): fixed typo. - * src/lib/general/gr_deinterleave.{h,cc,i}: new. - -2004-12-11 Eric Blossom - - * src/lib/general/gr_interleave.{h,cc,i}: new. - -2004-12-10 Eric Blossom - - * src/python/gnuradio/eng_option.py (check_intx): now parses hex - numbers too. - -2004-12-09 Eric Blossom - - * src/lib/filter/Makefile.am: fixed problem with gr_hilbert_fc on - OS/X (it was in the wrong place in the makefile). Now builds and - checks on OS/X. - -2004-12-06 Ramakrishnan Muthukrishnan - - * src/lib/filter/Makefile.am, src/lib/general/Makefile.am, - src/python/gnuradio/Makefile.am, - src/python/gnuradio/gr/Makefile.am: added *.pyc to CLEANFILES - -2004-11-30 Eric Blossom - - * src/python/gnuradio/gr/Makefile.am, configure.ac: modified to - no longer require run_test_trampoline. Now uses AC_CONFIG_COMMANDS to - set execute bit on run_tests. - * src/python/gnuradio/gr/run_test_trampoline: removed. - - * src/lib/filter/Makefile.am (swiginclude_HEADERS): fix typo in gr_hilbert_fc.i - -2004-11-27 Eric Blossom - - * src/python/gnuradio/gr/qa_hilbert.py: new - * src/lib/general/gr_firdes.i: moved from filter to general. - * src/lib/general/gr_firdes.{h,cc}: new method: reverse. - * src/lib/filter/gr_hilbert_fc.i: new. - * src/lib/filter/gr_hilbert_fc.cc: ensure ntaps is odd. - -2004-11-08 Stephane Fillod - - * src/lib/filter/Makefile.am, src/tests/Makefile.am, - src/lib/filter/complex_dotprod_generic.cc, - src/lib/filter/gr_fir_sysconfig_x86.{cc,h}, - src/lib/filter/qa_dotprod_x86.cc, src/lib/filter/qa_filter.cc: - added support for x86 SIMD CCC dotproduct. - * src/lib/filter/ccomplex_dotprod_3dnow.s, - src/lib/filter/ccomplex_dotprod_3dnowext.s, - src/lib/filter/ccomplex_dotprod_generic.{cc,h}, - src/lib/filter/ccomplex_dotprod_sse.s, - src/lib/filter/ccomplex_dotprod_x86.h, - src/lib/filter/gr_fir_ccc_simd.{cc,h}, - src/lib/filter/gr_fir_ccc_x86.{cc,h}, - src/lib/filter/qa_ccomplex_dotprod_x86.{cc,h}, - src/lib/filter/qa_gr_fir_ccc.{cc,h}, - src/tests/benchmark_dotprod.cc, - src/tests/benchmark_dotprod_{ccc,fcc,scc}.cc: new - -2004-11-08 Eric Blossom - - * src/lib/runtime/gr_block.h: new methods: set_input_signature and - set_output_signature. - -2004-11-04 Eric Blossom - - * configure.ac: upped version to 2.3cvs - - * configure.ac: set version to 2.3. Made release. - * src/python/gnuradio/audio.py (__init__): raise error if no audio - module found. - -2004-11-02 Eric Blossom - - * src/lib/runtime/gr_local_sighandler.cc (name): conditionalized - based on signal names. - -2004-10-30 Eric Blossom - - * src/lib/runtime/gr_local_sighandler.{h,cc}: new. get and set - signal handlers. - * src/lib/runtime/gr_vmcircbuf.cc (test_factory): install handlers - for SIGBUS and SIGSEGV while running tests. - -2004-10-18 Stephane Fillod - - * config/gr_pwin32.m4, src/lib/runtime/gr_preferences.cc: proper - detect Sleep() support, check for mkdir that takes only one arg - under win32. - * src/lib/runtime/gr_io_signature.cc, - src/lib/runtime/gr_io_signature.h, - src/lib/runtime/gr_io_signature.i, - src/lib/runtime/qa_gr_io_signature.cc: resolve a clash with - INFINITE already defined. - * src/lib/runtime/gr_pagesize.cc: declare missing prototype of - getpagesize() under win32. - -2004-10-18 Eric Blossom - - * src/python/gnuradio/gr/run_tests.in: allow VPATH building. - -2004-10-18 Stephane Fillod - - * configure.ac, src/lib/filter/Makefile.am, - src/lib/general/Makefile.am: allow VPATH building. - -2004-10-17 Eric Blossom - - * doc/Makefile.am (install-data-local): install html documentation. - * src/lib/filter/gr_iir_filter_ffd.cc (gr_iir_filter_ffd): removed - debug message. - * src/python/gnuradio/gr/run_tests.in: changed == to = for POSIX - compatibility. - * src/python/gnuradio/gr/qa_basic_flow_graph.py: use /usr/bin/env - to find python. - -2004-10-13 Eric Blossom - - * configure.ac: upped rev to 2.2cvs - -2004-10-11 Eric Blossom - - * configure.ac: bumped rev to 2.2, make release - * Makefile.am (EXTRA_DIST): added config.h.in - -2004-10-07 Eric Blossom - - * src/python/gnuradio/lmx2306.py: now works! - -2004-09-29 Eric Blossom - - * src/lib/filter/gri_iir.h: renamed from gr_iir.h. Also, changed - the sign back. We're consistent with Oppenheim and Schafer, - "Discrete-Time Signal Processing." Documented exactly what we - compute. Faster delay line implementation. - * src/lib/filter/gr_iir_filter_ffd.{h,cc,i}: new direct form IIR block. - -2004-09-23 Eric Blossom - - * config/usrp_fusb_tech.m4, config/bnv_have_qt.m4, config/cppunit.m4, - config/gr_check_mc4020.m4, config/gr_check_usrp.m4, config/gr_doxygen.m4, - config/gr_gprof.m4, config/gr_scripting.m4, config/gr_set_md_cpu.m4, - config/pkg.m4, config/usrp_fusb_tech.m4: added additional quoting - to first arg of AC_DEFUN to silence automake warning. - -2004-09-22 Eric Blossom - - * src/lib/io/gr_file_descriptor_sink.cc: added missing #include - * src/lib/io/gr_file_descriptor_source.cc: added missing #include - -2004-09-21 Matthew Hall - - * src/gnu/lib/gr/gr_iir.h: rewrote ctor docs. Fixed sign error - in filter method. Now gr_iir uses Direct Form I of IIR. - -2004-09-19 Eric Blossom - - * src/lib/general/gr_complex_to_xxx.{h,cc,i}: new blocks. - * src/python/gnuradio/gr/qa_complex_xxx.py: new qa code. - - * src/lib/general/gr_simple_correlator.{h,cc,i}: payload size is - now in bytes, not bits. - * src/lib/general/gr_simple_framer.{h,cc,i}: payload size is - now in bytes, not bits. - - * src/lib/swig/Makefile.am: now tracks swig .i file dependencies. - * src/lib/swig/gnuradio.i: simplification and cleanup. - -2004-09-18 Eric Blossom - - These modifications happened sometime between 2004-09-08 and 2004-09-18. - The details are lost in the swirl around preparing the TAPR DCC. - - * src/lib/filter/gr_interp_fir_filter_XXX.{h,cc,i}.t: new - * src/lib/filter/generate_gr_interp_fir_filter_XXX.py: new - * src/lib/filter/generate_all.py: modified for to generate interpolating fir filter - * src/lib/general/gr_bytes_to_syms.{h,cc,i}: new - * src/lib/general/gr_frequency_modulator_fc.{h,cc,i}: new - * src/lib/general/gr_simple_framer.{h,cc,i}: new - * src/lib/general/gr_simple_framer_sync.h: new - * src/lib/general/gr_simple_correlator.{h,cc,i}: new - * src/lib/io/gr_oscope_guts.{h,cc}: new - * src/lib/io/gr_oscope_sink_{f,x}.{h,cc}: new - * src/lib/io/gr_trigger_mode.h: new - * src/lib/io/ppio.i: new - - The following changes are related to moving from SWIG 1.3.21 to 1.3.22 - - * src/lib/runtime/gr_block_detail.i: removed unneccesary global decl of friend. - * src/lib/runtime/gr_buffer.i: removed unneccesary global decl of friend. - * src/lib/runtime/gr_io_signature.i: removed unneccesary global decl of friend. - * src/lib/runtime/gr_single_threaded_scheduler.i: removed unneccesary global decl of friend. - * src/lib/swig/gnuradio.i: mods for improved STL support - - * src/lib/runtime/gr_types.h: new typedefs - * src/lib/swig/gen-swig-bug-fix: new. generate gnuradio_swig_bug_workaround.h - - * src/python/gnuradio/eng_notation.py: new - * src/python/gnuradio/grutil.py: new - * src/python/gnuradio/gr_unittest.py: new subclass of unittest - * src/python/gnuradio/lmx2306.py: new. Control National PLL synthesizer - * src/python/gnuradio/microtune.py: new. Command line interface - to microtune boards. - * src/python/gnuradio/gr/qa_frequency_modulator.py: new - * src/python/gnuradio/gr/qa_fsk_stuff.py: new - * src/python/gnuradio/gr/qa_head.py: new - * src/python/gnuradio/gr/qa_interp_fir_filter.py: new - * src/python/gnuradio/gr/qa_sig_source.py: new - -2004-09-08 Eric Blossom - - * src/python/gnuradio/gr/basic_flow_graph.py - (basic_flow_graph.validate): now calls check_topology. - * src/lib/runtime/gr_block.{h,cc,i} (check_topology): new method. - - * src/lib/general/gr_short_to_float.{h,cc,i}: new - * src/lib/general/gr_float_to_short.{h,cc,i}: new - -2004-08-26 Eric Blossom - - * src/lib/general/gr_fft_vfc.{h,cc,i}: new - * src/lib/general/gr_fft_vcc.{h,cc,i}: new - * src/lib/general/gri_fft.{h,cc}: renamed from gr_fft.{h,cc} - * src/lib/general/gr_serial_to_parallel.{h,cc,i}: new - * src/lib/general/gr_keep_one_in_n.{h,cc,i}: new - -2004-08-25 Eric Blossom - - * src/lib/io/gr_file_descriptor_source.{h,cc,i}: new - * src/lib/io/gr_file_descriptor_sink.{h,cc,i}: new - -2004-08-19 Eric Blossom - - * src/lib/general/gr_sig_source_X.cc.t (work): performance tweak - for constant case. - - * src/python/gnuradio/eng_option.py (check_eng_float): support - engineering notation in option parsing. E.g., 32k, 106.5M - -2004-08-18 Eric Blossom - - * src/python/gnuradio/gr/scheduler.py, - src/python/gnuradio/gr/basic_flow_graph.py, - src/python/gnuradio/gr/flow_graph.py, - src/python/gnuradio/gr/qa_flowgraph.py: modified to partition - graphs and assign separate threads to each disjoint set of - verticies. - - -2004-08-05 Eric Blossom - - * src/lib/general/gr_lfsr_32k_source_s.{h,cc,i}: new. - - * src/lib/general/gr_check_counting_s.{h,cc,i}: renamed from gr_counting_sink. - * src/lib/general/gri_lfsr_15_1_0.h: new LFSR generator with - period 32K-1 bits. - * src/lib/general/gri_lfsr_32k.h: new LFSR generator with period - 32K bits. - * src/lib/general/gr_counting_sink_s.{h,cc,i}: new. checks that - it's input is a counting sequence. - * src/lib/filter/Makefile.am: added missing .t files - -2004-07-31 Eric Blossom - - * src/lib/general/gr_vector_source_X.{h,cc,i}.t: added repeat - argument to constructor. - -2004-07-30 Eric Blossom - - * src/lib/general/gr_sig_source_X.cc.t (work): now use gr_sincos - to compute both at same time. - - * src/lib/general/gr_nco.h (gr_nco): renamed method cossin -> sincos - and use gr_sincos to compute value. - - * configure.ac: upped rev to 2.1cvs. - -2004-07-21 Eric Blossom - - * configure.ac: upped rev to 2.1. Made release. - -2004-07-20 Eric Blossom - - * src/python/gnuradio/optfir.py: new. High level routines for optimal FIR design. - * src/lib/general/gr_remez.{h,cc}: new. Parks-McClellan method - for optimal FIR design. - -2004-07-19 Eric Blossom - - * src/lib/general/gri_add_const_ss_generic.cc: new. - * src/lib/general/gri_add_const_ss.h: new. - -2004-07-17 Eric Blossom - - * src/python/gnuradio/gr/flow_graph.py (buffer_sizes.allocate): - take into account output_multiple when computing buffer size. - - * src/lib/runtime/gr_block.i: added output_multiple and - relative_rate to swig interface. - -2004-07-12 Eric Blossom - - * configure.ac: upped rev to 2.0cvs - - * src/python/gnuradio/sdr_1000.py: added back in. - * src/lib/io/sdr_1000.{h,cc}: added back in. - -2004-07-11 Eric Blossom - - * config/gr_boost.m4 (GR_REQUIRE_BOOST_INCLUDES): new m4 macro. - -2004-07-09 Eric Blossom - - * src/lib/audio-oss: removed all files and moved to gr-audio-oss package. - -2004-07-04 Eric Blossom - - * src/lib/general/gr_{add,sub,multiply,divide}_XX.{h,i,cc}.t: new - * src/lib/general/gr_multiply_const_XX.{h,i,cc}.t: new - * src/lib/runtime/gr_block.{h,cc} (class gr_block): renamed - basic_work method to general_work - * src/lib/general/gr_sync_block.{h,cc} (class gr_sync_block): - renamed sync_work method to work. - -2004-07-03 Eric Blossom - - * src/python/gnuradio/gr/scheduler.py: new. Now run graph in - separate thread. - * src/lib/runtime/gr_single_threaded_scheduler.{h,i,cc}: added - stop method. - * src/lib/general/gr_noise_source_X.{h,i,cc}.t: new random noise source. - * config/gr_swig.m4: fail, not warn, if the right version isn't found. - * src/lib/general/gr_random.{h,cc}: moved implementation specific - defines out of header and into implementation. Also moved statics - into class and cleaned up a couple of other annoyances. - -2004-07-01 Eric Blossom - - * src/python/gnuradio/gr/run_tests.in: new. Sets PYTHONPATH - for sucessful testing in build tree; runs all tests. - * src/lib/runtime/{gr_block.i,gr_swig_block_magic.i}: revised to - use lambda expression for repr printing instead of referencing global. - * src/lib/swig/Makefile.am: now generate standalone swig runtime - library that all other swig modules link against. - -2004-06-21 Eric Blossom - - Cleaned up interface to microtune modules and eval boards. - Now uses boost::shared_ptr's. Refactored all uses 4937 and 4702, - and corresponding eval board classes. - - * src/lib/io/i2c.{h,cc}: split into i2c.{h,cc} and i2c_bitbang.{h,cc} - * src/lib/io/eval_board_4702_defs.h: deleted. - * src/lib/io/i2cio.{h,cc}: renamed to i2c_bbio.{h,cc} - * src/lib/io/i2cio_pp.{h,cc}: renamed to i2c_bbio_pp.{h,cc} - -2004-06-13 Eric Blossom - - * src/lib/general/gr_quadrature_demod_cf.{i,h,cc}: new. - - * src/lib/audio-oss/gr_audio_sink_oss.{i,h,cc}: new. - FIXME: should be moved into a different build tree to decouple oss - dependency. - - * src/lib/io/gr_file_{sink,source}.{i,h,cc} io.i: new. - -2004-06-12 Eric Blossom - - * src/lib/general/gr_sig_source_X.{h,cc,i}.t: new - * src/lib/general/gr_sig_source_waveform.h: new - * src/lib/general/gr_head.{h,cc,i}: new - - * src/lib/runtime/gr_block_detail.cc (set_done), gr_buffer.h: - propagate "done" upstream - - -2004-XX-XX Eric Blossom - - Months of changes... This was whatever it took to get - the beginning of the new code base working... - -2004-03-11 Eric Blossom - - * src/lib/runtime/io_signature.{h,cc}, - * src/lib/runtime/qa_io_signature.{h,cc}: new. - -2004-03-08 Eric Blossom - - Removed cppunit from our build tree and updated qa code to work - with cppunit-1.9.12 - - * Makefile.am - * bootstrap - * configure.ac - * config/Makefile.am - * config/cppunit.m4 - * src/lib/Makefile.am - * src/lib/atsc/convolutional_interleaver.h - * src/lib/atsc/qa_atsc_basic_trellis_encoder.cc - * src/lib/atsc/qa_atsc_data_interleaver.cc - * src/lib/atsc/qa_atsc_equalizer_nop.cc - * src/lib/atsc/qa_atsc_fake_single_viterbi.cc - * src/lib/atsc/qa_atsc_fs_correlator.cc - * src/lib/atsc/qa_atsc_randomizer.cc - * src/lib/atsc/qa_atsc_reed_solomon.cc - * src/lib/atsc/qa_atsc_single_viterbi.cc - * src/lib/atsc/qa_atsc_trellis_encoder.cc - * src/lib/atsc/qa_atsc_viterbi_decoder.cc - * src/lib/atsc/qa_convolutional_interleaver.cc - * src/lib/atsc/qa_interleaver_fifo.cc - * src/lib/filter/qa_complex_dotprod_x86.cc - * src/lib/filter/qa_float_dotprod_x86.cc - * src/lib/filter/qa_gr_fir_CCF.cc - * src/lib/filter/qa_gr_fir_FCC.cc - * src/lib/filter/qa_gr_fir_FFF.cc - * src/lib/filter/qa_gr_fir_SCC.cc - * src/lib/filter/qa_gr_mmse_fir_interpolator.cc - * src/lib/filter/qa_sse_float_dotprod.cc - * src/lib/general/qa_gr_circular_file.cc - * src/lib/general/qa_gr_firdes.cc - * src/lib/general/old/qa_gr_fir_SSS.cc - * src/lib/general/old/qa_gr_fir_sse.cc - * src/lib/runtime/qa_gr_vmcircbuf.cc - * src/lib/vrx/VrComplex.h - * src/tests/GrTestSink.cc - * src/tests/GrTestSkippingSink.cc - * src/tests/GrTestSource.cc - - - -This code was derived from gnuradio-0.9 with a massive amount of hacking. - -# -# Copyright 2001,2002,2003,2004,2005,2006 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. -# diff --git a/gnuradio-core/THANKS b/gnuradio-core/THANKS deleted file mode 100644 index 00e44886..00000000 --- a/gnuradio-core/THANKS +++ /dev/null @@ -1,7 +0,0 @@ -GNU Radio THANKS file - -GNU Radio has originally been written by Free Software Foundation, Inc. -Many people have further contributed to GNU Radio by reporting problems, -suggesting various improvements, or submitting actual code. Here is -a list of these people. Help me keep it complete and exempt of errors. - diff --git a/gnuradio-examples/ChangeLog b/gnuradio-examples/ChangeLog deleted file mode 100644 index 458af025..00000000 --- a/gnuradio-examples/ChangeLog +++ /dev/null @@ -1,385 +0,0 @@ -For more recent changes, please see: - -http://gnuradio.org/trac/timeline - -2006-06-20 Eric Blossom - - * python/gmsk2/receive_path.py, python/gmsk2/transmit_path.py, - benchmark_gmsk_{tx,rx}.py: refactored to use modulation - independent pkt.py code. Lays the foundation for a single set of - tools that can exercise all modulations. More work required to - meet that goal, but we're closing in. - - * python/gmsk2/tunnel.py: refactored version of - tunnel_ip_null_mac. This creates a virtual ethernet inteface - using the TAP driver, and then tunnels packets across the air - using GMSK and a simple carrier sense MAC. Fixed problem with - truncation of large packets which was leading to stalls. - - * python/gmsk2/tunnel_ip_null_mac.py: removed. Replaced with - tunnel.py - -2006-06-15 Eric Blossom - - * python/usrp/usrp_fft.py (app_flow_graph.set_decim): added - missing return value. - - * python/usrp/usrp_oscope.py, python/usrp/usrp_fft.py: you can now - change the decimation factor in the GUI. - -2006-06-06 Eric Blossom - - * python/gmsk2/mpsk.py: Lots of rework. QPSK is now - working with mpsk_test.py. Need to confirm it on the air, and then - make BPSK work again. - - -2006-05-30 Eric Blossom - - Standardized on mpsk as the prefix. Renamed a bunch of stuff to - restore sanity: - * python/gmsk2/benchmark_xpsk_rx.py -> python/gmsk2/benchmark_mpsk_rx.py - * python/gmsk2/benchmark_xpsk_tx.py -> python/gmsk2/benchmark_mpsk_tx.py - * python/gmsk2/psk_receive_path.py -> python/gmsk2/mpsk_receive_path.py - * python/gmsk2/psk_transmit_path.py -> python/gmsk2/mpsk_transmit_path.py - * python/gmsk2/xpsk.py -> python/gmsk2/mpsk.py - * python/gmsk2/xpsk_pkt.py -> python/gmsk2/mpsk_pkt.py - * python/gmsk2/xpsk_test.py -> python/gmsk2/mpsk_test.py - -2006-05-29 Eric Blossom - - * python/gmsk2/qpsk_tester.py, python/gmsk2/qpsk_usrp_tester.py: - new. Test benches for qpsk code. Thanks Tom! - -2005-12-19 Martin Dvh - - updated multi_usrp examples which should now work 'out-of-the-box' with current cvs - (you need updated usrp,gr-usrp, gnuradio-core and gnuradio-examples) - - * configure.ac: added python/usrp_multi/Makefile - * python/Makefile.am: added multi_usrp - * python/multi_usrp/.cvsignore: new - * python/multi_usrp/Makefile.am: new - * python/multi_usrp/README: Made this into a real readme - * python/multi_usrp/multi_usrp_oscope.py: changed to work with current usrp_multi code in cvs - * python/multi_usrp/multi_usrp_rx_cfile.py: changed to work with current usrp_multi code in cvs - * python/multi_usrp/multi_usrp.py: removed - * python/multi_usrp/multi_usrp_oscope_showcounters.py: removed - * python/multi_usrp/multi_usrp_oscope_simple.py: removed - * python/multi_usrp/multi_usrp_oscope_standalone.py: removed - * python/multi_usrp/multi_usrp_rx_tofile.py: removed - * python/multi_usrp/multi_usrp_rx_tofile_standalone.py: removed - * python/multi_usrp/multi_usrp_test_counting.py: removed - -2006-05-10 Eric Blossom - - * python/gmsk2/psk_transmit_path.py: add diff=False per Bob Vincent. - -2006-04-06 Eric Blossom - - * python/usrp/usrp_fft.py: removed explicit setting of fft_rate. - The code will now pick it up from config files. - -2006-03-12 Eric Blossom - - * python/usrp/usrp_siggen.py: added daughterboard support. - * python/usrp/usrp_oscope.py, python/usrp/usrp_fft.py: fixed so - frequency can be set even after an invalid frequency is passed on - the command line. - -2006-03-10 Eric Blossom - - * python/gmsk2/xpsk.py: doc fixes. - -2006-03-08 Eric Blossom - - * python/usrp/fm_tx_2_daughterboards.py: example that transmits - different signals out two daughterboards. - -2006-02-02 Eric Blossom - - * python/usrp/usrp_oscope.py: support manual scaling of - Y-axis. Smarter defaulting of rx_subdev_spec if user doesn't pick. - * python/usrp/usrp_fft.py: Smarter defaulting of rx_subdev_spec if user doesn't pick. - -2006-02-01 Eric Blossom - - * python/gmsk2/transmit_path.py: fixed so it works on both A and B sides. - -2006-01-30 Eric Blossom - - * python/gmsk2/receive_path.py (receive_path.set_auto_tr): added - set_auto_tr to the receive path to have it work properly with - changes in auto t/r switching semantics. - - * python/usrp/fm_tx4.py (fm_tx_graph.__init__): changes to have it - work in both A and B sides. - -2005-12-19 Martin Dvh - - * multi_usrp/README, multi_usrp/multi_usrp.py, multi_usrp/multi_usrp_oscope.py, - multi_usrp/multi_usrp_oscope_showcounters.py, multi_usrp/multi_usrp_oscope_simple.py, - multi_usrp/multi_usrp_oscope_standalone.py, multi_usrp/multi_usrp_rx_tofile.py, - multi_usrp/multi_usrp_rx_tofile_standalone.py, multi_usrp/multi_usrp_test_counting.py: - new directory and examples to exercise multiple usrps coherently - connected together. These require additional code that is not yet - in the repository. - -2005-12-13 Eric Blossom - - * python/usrp/usrp_wfm_rcv2_nogui.py: new: receive two FM stations - simultaneously. - -2005-12-09 Eric Blossom - - * python/gmsk2/tunnel_ip_null_mac.py: cleaned up. gathered mac - functions together. - - * python/usrp/usrp_wfm_rcv_pll.py (pick_subdevice), - python/usrp/usrp_wfm_rcv_nogui.py (pick_subdevice): use library version. - * python/usrp/fm_tx4.py: explicity call set_enable(True) to turn - on transmitter (required due to policy change). Also removed - pick_tx_subdevice. Now use version in usrp library. - -2005-12-09 Eric Blossom - - Made release 2.6 - -2005-12-08 Eric Blossom - - * python/gmsk/rx.py, python/gmsk/rx2.py, python/gmsk/tx.py, - python/gmsk/tx2.py, python/gmsk/xcvr.py, python/gmsk/xcvr2.py, - ggmsk-test.py, gmsk-test.py: removed. Use the code in ../gmsk2 instead. - - * python/gmsk2/receive_path.py, python/gmsk2/transmit_path.py: - New. Extracted hierarchical blocks from benchmark_gmsk_{tx,rx}.py - -2005-12-06 Eric Blossom - - * python/gmsk2/benchmark_gmsk_tx.py, - python/gmsk2/benchmark_gmsk_rx.py: now support "--bitrate" command - line arg. - * python/gmsk2/pick_bitrate.py: given a bitrate, determine - samples/baud and interp/decim ratio. - -2005-11-11 Eric Blossom - - * python/usrp/usrp_nbfm_ptt.py, python/usrp/usrp_wfm_rcv.py: moved - pick_xx_subdev to library. - -2005-11-01 Eric Blossom - - * python/usrp/dbs_nbfm.py: removed. Use usrp_nbfm_rcv.py instead. - -2005-10-24 Eric Blossom - - * python/usrp/usrp_oscope.py: basically identical to usrp_fft.py, - but uses oscope sink. - - * python/usrp/usrp_wfm_rcv_nogui.py, python/usr/usrp_wfm_rcv.py: - increased usrp decimation factor to 200 reduce host cpu - requirements. With the half-band in the FPGA, good decimation - factors are even values in [8,256]. - -2005-10-14 Eric Blossom - - * python/usrp/usrp_fft.py: gui mods. - * python/usrp/usrp_wfm_rcv.py: reworked gui. - -2005-10-11 Eric Blossom - - * python/usrp/usrp_waterfall.py: removed. Use usrp_fft.py -W instead. - -2005-10-10 Eric Blossom - - * python/audio/audio_copy.py, python/audio/audio_play.py, - python/audio/audio_to_file.py, python/audio/dial_tone.py, - python/audio/mono_tone.py, python/audio/multi_tone.py, - python/audio/spectrum_inversion.py: revised to use standard - command line args and canonical structure. - -2005-09-21 Eric Blossom - - * python/usrp/usrp_fft.py: extensively reworked to use new - daughterboard auto-instantiation framework. - -2005-07-30 Martin Dvh - - * python/usrp/tvrx_tv_rcv.py: PAL/NTSC TV demod. Work in progress. - -2005-07-21 Eric Blossom - - * python/usrp/benchmark_usb.py, python/usrp/usrp_rx_cfile.py, - python/usrp/usrp_oscope.py, python/usrp/dbs_debug: doc fix. - -2005-07-19 Eric Blossom - - * python/usrp/ayfabtu.py: new. Transmit on 25 frequencies simultaneously! - -2005-07-02 Eric Blossom - - * config/gr_no_undefined.m4, config/gr_x86_64.m4: new, x86_64 support. - * config/gr_python.m4: backed out search for libpython, making - x86_64 work and breaking Cygwin/MinGW. - * configure.ac: mods for x86_64, $(NO_UNDEFINED) - - * python/usrp/usrp_waterfall.py, python/usrp/dbs_debug.py, - python/usrp/flexrf_debug.py, python/usrp/flexrf_siggen.py, - python/usrp/usrp_fft.py, python/usrp/usrp_oscope.py, - python/usrp/usrp_rx_cfile.py, python/usrp/usrp_rx_file.py, - python/usrp/usrp_siggen.py, python/usrp/usrp_waterfall.py: - gru.hexint fix for python 2.4. - -2005-06-17 Eric Blossom - - * python/apps/README: new directory for applications. - -2005-06-16 Eric Blossom - - * python/usrp/tvrx_wfm_rcv_gui.py: add -d audio_device option; fix - volume increment so up == 1.0/down; fix default range of bottom FFT. - -2005-06-13 Eric Blossom - - * python/usrp/tvrx_wfm_rcv_gui.py: removed limit on what frequency - can be set. - -2005-05-09 Stephane Fillod - - * config/gr_sysv_shm.m4: SysV shared memory not mandatory - * config/gr_pwin32.m4, config/gr_python.m4, config/lf_cxx.m4: - fixes for Cygwin, MinGW - -2005-04-27 Eric Blossom - - * python/digital_voice/encdec.py: simulate gsm voice encode / - gmsk mod / gmsk demod / gsm voice decode. - -2005-03-29 Eric Blossom - - * python/gmsk/ggmsk-test.py, python/gmsk/gmsk-test.py: new GMSK - test code from Joshua Lackey - - * python/gmsk/tx.py, python/gmsk/rx.py: new tx and rx modules that - depending on command line options do either FSK or GMSK and use - either files, sockets, named pipes or a USRP for their inputs and - outputs. From Bob Vincent - -2005-03-29 Eric Blossom - - * python/audio/audio_copy.py, python/audio/multi_tone.py, - python/audio/mono_tone.py: replace ALSA specific default argument - with "" - -2005-03-04 Eric Blossom - - * python/usrp/nbfm_ptt_quick_and_dirty.py: simple NBFM - push-to-talk transceiver. (Works, but has a latency problem that - needs to be fixed) - -2005-02-28 Eric Blossom - - * python/usrp/fsk_tx.py: reduced gain, added -N (no gui) flag. - * python/usrp/fsk_rx.py: added -N (no gui) flag. - Running Tx and Rx on same machine (1.4 GHz Pentium M) 100kb/sec - burns up about 70% of CPU with -N options on both. - -2005-02-25 Eric Blossom - - Removed usrp0 directory. - Moved contents of usrp1 directory into usrp directory. - -2005-02-22 Eric Blossom - - * python/usrp1/nbfm_rcv.py: added squelch. - -2004-10-13 Eric Blossom - - * configure.ac: upped rev to 0.2cvs - -2004-10-11 Eric Blossom - - * Makefile.am (EXTRA_DIST): added config.h.in - -2004-10-07 Chuck Swiger - - * python/audio/audio_to_file.py: coerce audio sample rate to int. - -2004-10-07 Eric Blossom - - * python/usrp1/wfm_rcv.py: new. Single channel broadcast FM - receiver for usrp1 + microtune 4937. - -2004-09-23 Eric Blossom - - * config/usrp_fusb_tech.m4, config/bnv_have_qt.m4, config/cppunit.m4, - config/gr_check_mc4020.m4, config/gr_check_usrp.m4, config/gr_doxygen.m4, - config/gr_gprof.m4, config/gr_scripting.m4, config/gr_set_md_cpu.m4, - config/pkg.m4, config/usrp_fusb_tech.m4: added additional quoting - to first arg of AC_DEFUN to silence automake warning. - -2004-09-18 Eric Blossom - - These changes happened somewhere around DCC - - * python/usrp/usrp_fft.py: new - * python/usrp1/dsb_tx.py: new double sideband AM transmitter - * python/usrp1/fm_tx4.py: simultaneous 4 channel narrow band FM transmitter - * python/usrp1/fsk_rx.py: FSK Rx module. Needs some work. - * python/usrp1/fsk_tx.py: FSK Tx module. Needs some work. - -2004-08-19 Eric Blossom - - * python/usrp/usrp_rx_file.py (main): added command line parsing. - * python/usrp/usrp_siggen.py: added command line parsing. - - * python/usrp1/test_digital_loopback_lfsr.py, - python/usrp1/test_digital_loopback_counting.py, - python/usrp1/test_digital_counting.py: new. Take advantage of - scheduler fix to implement both the tx and rx path's in the same - flow graph. - - -2004-07-31 Eric Blossom - - * python/usrp0, python/usrp1: new directories for rev specific examples. - * python/usrp1/loopback.py (main): new. - -2004-07-30 Eric Blossom - - * python/usrp/usrp_siggen.py: now directly queries hardware for dac freq. - * python/usrp/usrp_rx_file.py: now directly queries hardware for dac freq. - -2004-07-17 Eric Blossom - - * python/mc4020/fm_demod.py: updated to use new mc4020 block, formatting - -2004-07-12 Eric Blossom - - * configure.ac: upped rev to 0.1cvs - -2004-07-03 Eric Blossom - - * python/usrp/usrp_siggen.py: Yeah! The first demo program that - reconfigures the flow graph on the fly! - -# -# Copyright 2004 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. -# diff --git a/gnuradio-examples/python/limbo/networking/Makefile.am b/gnuradio-examples/python/limbo/networking/Makefile.am deleted file mode 100644 index d3029453..00000000 --- a/gnuradio-examples/python/limbo/networking/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright 2006 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. -# - -EXTRA_DIST = \ - measurement_slave.py \ No newline at end of file diff --git a/gnuradio-examples/python/limbo/networking/measurement_slave.py b/gnuradio-examples/python/limbo/networking/measurement_slave.py deleted file mode 100755 index a2b04151..00000000 --- a/gnuradio-examples/python/limbo/networking/measurement_slave.py +++ /dev/null @@ -1,241 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006 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. -# - -import struct -import socket -import asyncore -import sys -import optparse -import random -from gnuradio.eng_option import eng_option -import gnuradio.gr.gr_threading as _threading - -LOOP_TIMEOUT = 0.001 -BROADCAST_ADDR = '255.255.255.255' - -BROADCAST_PORT = 27010 # UDP -CONTROL_PORT = 27011 # TCP - -PKT_HEADER_SIZE = 4 # 32-bit int - -logfile = None - -def unpack_header(s): - (len,) = struct.unpack('!i', s) - return (len,) - -def pack_header(len): - return struct.pack('!i', len) - - -class control_port_listener(asyncore.dispatcher): - def __init__(self, port=CONTROL_PORT, udp_socket=None, verbose=False): - """ - @param port: TCP port to listen on. - @type port: int - """ - asyncore.dispatcher.__init__(self) - - self._verbose = verbose - self._udp_socket = udp_socket - - host = '' # symbolic name for localhost - self.create_socket(socket.AF_INET, socket.SOCK_STREAM) - self.set_reuse_addr() - - try: - self.bind((host, port)) - except socket.error, err: - sys.stderr.write('Failed to bind to %s: %s\n' % - ((host, port), os.strerror (err.args[0]),)) - sys.exit(1) - - self.listen(3) - - def handle_accept(self): - socket, addr = self.accept() - sys.stderr.write("handle_accept: %r\n" % (addr,)) - if not(socket is None): - # instantiate a server - s = control_server(socket, addr, self._udp_socket, self._verbose) - - -class gr_dispatcher(asyncore.dispatcher): - def __init__(self, sock=None, map=None): - asyncore.dispatcher.__init__(self, sock=sock, map=map) - - def read_packet(self): - """ - Returns None or packet - """ - s = self.recvall(PKT_HEADER_SIZE) - if s == '': - return None - - (payload_len,) = unpack_header(s) - - payload_len = int(payload_len) - - if payload_len == 0: - payload = '' - else: - payload = self.recvall(payload_len) - if len(payload) != payload_len: - sys.stderr.write ('short recv, expected %d bytes, got %d\n' % ( - payload_len, len(payload))) - raise RuntimeError, "short recv" - - return payload - - def recvall(self, buffer_size): - result = '' - while len(result) < buffer_size: - data = self.recv(buffer_size - len(result)) - if not data: - return '' - result += data - return result - - -class pkt_receiver_thread(_threading.Thread): - def __init__(self, socket): - _threading.Thread.__init__(self) - self.setDaemon(1) - self.socket = socket - self.keep_running = True - self.start() - - def run(self): - while self.keep_running: - pkt, sender = self.socket.recvfrom(10000) - if pkt: - if len(pkt) > 2: - t = struct.unpack('!H', pkt[0:2]) - seqno = t[0] - else: - seqno = -1 - - logfile.write('RCVD seqno %4d len %4d from %s\n' % (seqno, len(pkt), sender)) - logfile.flush() - - -class control_server(gr_dispatcher): - def __init__(self, socket, addr, udp_socket, verbose=False): - gr_dispatcher.__init__(self, sock=socket) - - self._udp_socket = udp_socket - self.verbose = verbose - self.setblocking(1) - - def writable(self): - return False - - def handle_read(self): - pkt = self.read_packet() - if pkt: - annotate = 'ANNOTATE' - if pkt.startswith(annotate): - logfile.write(pkt[len(annotate)+1:]) - logfile.write('\n') - logfile.flush() - elif pkt.startswith('SEND'): - tokens = pkt.split() - if len(tokens) < 4: - invalid_packet(pkt) - else: - npkts = int(tokens[1]) - size = int(tokens[2]) - power = float(tokens[3]) - send_test_packets(self._udp_socket, npkts, size, power) - else: - invalid_packet(pkt) - - def handle_close(self): - self.close() - - -def invalid_packet(pkt): - sys.stderr.write('received unrecognized packet: %s\n' % (pkt,)) - - -def make_random_payload(size): - p = [0] * size - if 1: - for i in range(size): - p[i] = chr(random.randint(0, 255)) - else: - for i in range(size): - p[i] = chr(i % 256) - return ''.join(p) - - -def send_test_packets(udp_socket, npkts, size, power): - # we ignore power for now... - size = max(2, size) - payload = make_random_payload(size - 2) - for n in range(npkts): - pkt = struct.pack('!H', n) + payload - udp_socket.sendto(pkt, (BROADCAST_ADDR, BROADCAST_PORT)) - #udp_socket.sendall(pkt) - - -def open_udp_broadcast_socket(gr0_host_ip, port): - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) -# s.bind((gr0_host_ip, port)) - s.bind(('', port)) - s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) -# s.connect((BROADCAST_ADDR, port)) - return s - - -def main(): - global logfile - - usage = 'usage: %prog [options] gr0-ip-addr' - parser = optparse.OptionParser (option_class=eng_option, usage=usage) - parser.add_option('-l', '--logfile', type='string', default=None, - help="specify log file name [default=]") - parser.add_option('-v', '--verbose', action="store_true", default=False, - help="enable verbose diagnostics") - - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - sys.exit(1) - - gr0_ip_addr = args[0] - if options.logfile is None: - logfile = sys.stdout - else: - logfile = file(options.logfile, 'w') - - udp_socket = open_udp_broadcast_socket(gr0_ip_addr, BROADCAST_PORT) - R = pkt_receiver_thread(udp_socket) - L = control_port_listener(CONTROL_PORT, udp_socket=udp_socket, verbose=options.verbose) - asyncore.loop(LOOP_TIMEOUT) - - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - pass diff --git a/gnuradio-examples/python/limbo/sounder/Makefile.am b/gnuradio-examples/python/limbo/sounder/Makefile.am deleted file mode 100644 index 9814d80e..00000000 --- a/gnuradio-examples/python/limbo/sounder/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -# -# Copyright 2007 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. -# - -EXTRA_DIST = \ - usrp_sounder_rx.py \ - usrp_sounder_tx.py \ - usrp_source.py \ - usrp_sink.py \ - sounder_rx.py \ - sounder_tx.py - -MOSTLYCLEANFILES = *.pyc *~ *.dat diff --git a/gnuradio-examples/python/limbo/sounder/sounder_rx.py b/gnuradio-examples/python/limbo/sounder/sounder_rx.py deleted file mode 100644 index d24eb8ef..00000000 --- a/gnuradio-examples/python/limbo/sounder/sounder_rx.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 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, usrp, eng_notation -from usrp_source import usrp_source_c -import math - -n2s = eng_notation.num_to_str - -class sounder_rx(gr.hier_block2): - """ - Creates a channel sounder receiver block with the given parameters. - """ - - def __init__(self, chip_rate, degree, verbose): - - # Call hierarchical block constructor - # Top-level blocks have no inputs or outputs - gr.hier_block2.__init__(self, - "sounder_rx", # Block typename - gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature - gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature - - self._degree = degree - self._chip_rate = chip_rate - self._verbose = verbose - self._length = 2**self._degree-1 - self._rep_rate = self._chip_rate/float(self._length) - - if self._verbose: - print "Using PN sequence of degree", self._degree, "length", self._length - print "Sequence repetition rate is", n2s(self._rep_rate), "per sec" - - self.connect(self, gr.pn_correlator_cc(self._degree), self) diff --git a/gnuradio-examples/python/limbo/sounder/sounder_tx.py b/gnuradio-examples/python/limbo/sounder/sounder_tx.py deleted file mode 100644 index dcdd9fc5..00000000 --- a/gnuradio-examples/python/limbo/sounder/sounder_tx.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 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, usrp, eng_notation -import math - -n2s = eng_notation.num_to_str - -class sounder_tx(gr.hier_block2): - """ - Creates a channel sounder generator with the given parameters. - """ - - def __init__(self, degree, chip_rate, verbose): - gr.hier_block2.__init__(self, - "sounder_tx", # Block typename - gr.io_signature(0,0,0), # Input signature - gr.io_signature(1, 1, gr.sizeof_float)) # Output signature - - self._degree = degree - self._chip_rate = chip_rate - self._verbose = verbose - self._length = 2**degree-1 - - # Connect PN source to block output - self.connect(gr.glfsr_source_f(degree), self) diff --git a/gnuradio-examples/python/limbo/sounder/usrp_sink.py b/gnuradio-examples/python/limbo/sounder/usrp_sink.py deleted file mode 100644 index 34b61070..00000000 --- a/gnuradio-examples/python/limbo/sounder/usrp_sink.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 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, usrp, eng_notation -n2s = eng_notation.num_to_str - -# Hierarchical block implementing a USRP sink for complex floats, -# with convenience functions for tuning, interpolation, etc. -# -class usrp_sink_c(gr.hier_block2): - """ - Create a USRP sink object accepting complex floats. - """ - def __init__(self, which=0, subdev_spec=None, if_rate=None, - freq=0.0, calibration=0.0, verbose=False): - # Call hierarchical block constructor - gr.hier_block2.__init__(self, - "usrp_sink_c", # Block typename - gr.io_signature(1,1,gr.sizeof_gr_complex), # Input signature - gr.io_signature(0,0,0)) # Output signature - - self._verbose = verbose - self._u = usrp.sink_c(which) - if self._verbose: - print 'DAC sample rate is', n2s(self._u.dac_rate()), "sps" - self.set_subdev(subdev_spec) - self.set_if_rate(if_rate) - self.set_calibration(calibration) - self.tune(freq) - self.connect(self, self._u) - - def set_subdev(self, subdev_spec): - if subdev_spec is None: - subdev_spec = self.pick_subdevice() - self._subdev = usrp.selected_subdev(self._u, subdev_spec) - self._u.set_mux(usrp.determine_tx_mux_value(self._u, subdev_spec)) - if self._verbose: - print 'TX using', self._subdev.name(), 'daughterboard' - - def pick_subdevice(self): - """ - The user didn't specify a subdevice. - If there's a daughterboard on A, select A. - If there's a daughterboard on B, select B. - Otherwise, select A. - """ - if self._u.db[0][0].dbid() >= 0: # dbid is < 0 if there's no d'board or a problem - return (0, 0) - if self._u.db[1][0].dbid() >= 0: - return (1, 0) - return (0, 0) - - def set_if_rate(self, if_rate): - # If no IF rate specified, set to maximum interpolation - if if_rate is None: - self._interp = 512 - else: - self._interp = 4*int(self._u.dac_rate()/(4.0*if_rate)+0.5) - - - self._if_rate = self._u.dac_rate()/self._interp - self._u.set_interp_rate(self._interp) - - if self._verbose: - print "USRP interpolation rate is", self._interp - print "USRP IF rate is", n2s(self._if_rate), "sps" - - def set_calibration(self, calibration): - self._cal = calibration - if self._verbose: - print "Using frequency calibration offset of", n2s(calibration), "Hz" - - def tune(self, freq): - """ - Set the center frequency we're interested in. - - @param target_freq: frequency in Hz - @type: bool - - Tuning is a two step process. First we ask the front-end to - tune as close to the desired frequency as it can. Then we use - the result of that operation and our target_frequency to - determine the value for the digital down converter. - """ - self._tune_result = self._u.tune(self._subdev._which, self._subdev, freq+self._cal) - if self._tune_result: - if self._verbose: - print "Baseband frequency is", n2s(self._tune_result.baseband_freq), "Hz" - print "DXC frequency is", n2s(self._tune_result.dxc_freq), "Hz" - print "Center frequency is", n2s(freq), "Hz" - print "Residual frequency is", n2s(self._tune_result.residual_freq), "Hz" - return True - - return False - -if __name__ == '__main__': - sink = usrp_sink_c(verbose=True) - diff --git a/gnuradio-examples/python/limbo/sounder/usrp_sounder_rx.py b/gnuradio-examples/python/limbo/sounder/usrp_sounder_rx.py deleted file mode 100755 index 6b85281a..00000000 --- a/gnuradio-examples/python/limbo/sounder/usrp_sounder_rx.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 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, eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser -from usrp_source import usrp_source_c -from sounder_rx import sounder_rx - -n2s = eng_notation.num_to_str - -class usrp_sounder_rx(gr.top_block): - def __init__(self, options): - gr.top_block.__init__(self, "usrp_sounder_rx") - self._options = options - self._u = usrp_source_c(0, - self._options.rx_subdev_spec, - self._options.gain, - self._options.chip_rate, - self._options.freq, - self._options.cal, - self._options.verbose) - self._options.chip_rate = self._u._if_rate - self._length = 2**self._options.degree-1 - self._receiver = sounder_rx(self._options.chip_rate, - self._options.degree, - self._options.verbose) - - samples = 100 * self._length**2 - - head = gr.head(gr.sizeof_gr_complex, samples) - c2m = gr.complex_to_mag() - s2v = gr.stream_to_vector(gr.sizeof_float, self._length) - lpf = gr.single_pole_iir_filter_ff(self._options.alpha, self._length) - v2s = gr.vector_to_stream(gr.sizeof_float, self._length) - sink = gr.file_sink(gr.sizeof_float, "impulse.dat") - - self.connect(self._u, head, self._receiver, c2m, s2v, lpf, v2s, sink) - - if self._options.verbose: - print "Chip rate is", n2s(self._options.chip_rate), "chips/sec" - print "Resolution is", n2s(1.0/self._options.chip_rate), "sec" - print "Using PN code of degree", self._options.degree - -def main(): - parser = OptionParser(option_class=eng_option) - parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=None, - help="select USRP Rx side A or B (default=first found)") - parser.add_option("-f", "--freq", type="eng_float", default=0.0, - help="set center frequency (default=%default)") - parser.add_option("-c", "--cal", type="eng_float", default=0.0, - help="set frequency calibration offset (default=%default)") - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="print extra debugging info") - parser.add_option("-d", "--degree", type="int", default=10, - help="set PN code degree (length=2**degree-1, default=%default)") - parser.add_option("-r", "--chip-rate", type="eng_float", default=8e6, - help="set sounder chip rate (default=%default)") - parser.add_option("-g", "--gain", type="eng_float", default=None, - help="set receiver gain (default=%default)") - parser.add_option("", "--alpha", type="eng_float", default=1.0, - help="set smoothing constant (default=%default)") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - sys.exit(1) - - top_block = usrp_sounder_rx(options) - - try: - top_block.run() - except KeyboardInterrupt: - pass - -if __name__ == '__main__': - main () diff --git a/gnuradio-examples/python/limbo/sounder/usrp_sounder_tx.py b/gnuradio-examples/python/limbo/sounder/usrp_sounder_tx.py deleted file mode 100755 index ae531d51..00000000 --- a/gnuradio-examples/python/limbo/sounder/usrp_sounder_tx.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 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, eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser -from usrp_sink import usrp_sink_c -from sounder_tx import sounder_tx - -n2s = eng_notation.num_to_str - -class usrp_sounder_tx(gr.top_block): - def __init__(self, subdev_spec, freq, cal, verbose, degree, chip_rate, amplitude): - - # Call hierarchical block constructor - # Top-level blocks have no inputs or outputs - gr.top_block.__init__(self, "usrp_sounder_tx") - self._freq = freq - self._cal = cal - self._verbose = verbose - self._degree = degree - self._length = 2**degree-1 - self._amplitude = amplitude - - self._u = usrp_sink_c(0, subdev_spec, chip_rate, self._freq, self._cal, self._verbose) - self._chip_rate = self._u._if_rate - self._max_time = float(self._length)/self._chip_rate - self._pn = sounder_tx(self._degree, self._chip_rate, self._verbose) - self._gain = gr.multiply_const_ff(amplitude) - self._f2c = gr.float_to_complex() - self.connect(self._pn, self._gain, self._f2c, self._u) - - if self._verbose: - print "Chip rate is", n2s(self._chip_rate), "chips/sec" - print "Resolution is", n2s(1.0/self._chip_rate), "sec" - print "Using PN code of degree", self._degree, "length", 2**self._degree-1 - print "Maximum measurable impulse response is", n2s(self._max_time), "sec" - print "Output amplitude is", amplitude - - -def main(): - parser = OptionParser(option_class=eng_option) - - # Transmit path options - parser.add_option("-T", "--tx-subdev-spec", type="subdev", default=None, - help="select USRP Rx side A or B (default=first found)") - parser.add_option("-f", "--freq", type="eng_float", default=0.0, - help="set center frequency (default=%default)") - parser.add_option("-c", "--cal", type="eng_float", default=0.0, - help="set frequency calibration offset (default=%default)") - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="print extra debugging info") - parser.add_option("-d", "--degree", type="int", default=10, - help="set PN code degree (length=2**degree-1, default=%default)") - parser.add_option("-r", "--chip-rate", type="eng_float", default=8e6, - help="set sounder chip rate (default=%default)") - parser.add_option("-g", "--amplitude", type="eng_float", default=8000.0, - help="set output amplitude (default=%default)") - parser.add_option("", "--real-time", action="store_true", default=False, - help="Attempt to enable real-time scheduling") - (options, args) = parser.parse_args() - - if len(args) != 0: - parser.print_help() - sys.exit(1) - - if not options.real_time: - realtime = False - else: - # Attempt to enable realtime scheduling - r = gr.enable_realtime_scheduling() - if r == gr.RT_OK: - realtime = True - else: - realtime = False - print "Note: failed to enable realtime scheduling" - - # Create an instance of a hierarchical block - top_block = usrp_sounder_tx(options.tx_subdev_spec, options.freq, options.cal, - options.verbose, options.degree, options.chip_rate, - options.amplitude) - - try: - # Run forever - top_block.run() - except KeyboardInterrupt: - # Ctrl-C exits - pass - -if __name__ == '__main__': - main () diff --git a/gnuradio-examples/python/limbo/sounder/usrp_source.py b/gnuradio-examples/python/limbo/sounder/usrp_source.py deleted file mode 100644 index 63eb3ce2..00000000 --- a/gnuradio-examples/python/limbo/sounder/usrp_source.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 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, usrp, eng_notation -n2s = eng_notation.num_to_str - -# Hierarchical block implementing a USRP source for complex floats, -# with convenience functions for gain, tune, decimation, etc. -# -class usrp_source_c(gr.hier_block2): - """ - Create a USRP source object supplying complex floats. - """ - def __init__(self, which=0, subdev_spec=None, gain=None, if_rate=None, - freq=0.0, calibration=0.0, verbose=False): - # Call hierarchical block constructor - gr.hier_block2.__init__(self, - "usrp_source_c", # Block typename - gr.io_signature(0,0,0), # Input signature - gr.io_signature(1,1,gr.sizeof_gr_complex)) # Output signature - - self._verbose = verbose - self._u = usrp.source_c(which) - if self._verbose: - print 'ADC sample rate is', n2s(self._u.adc_rate()), "sps" - self.set_subdev(subdev_spec) - self.set_if_rate(if_rate) - self.set_gain(gain) - self.set_calibration(calibration) - self.tune(freq) - self.connect(self._u, self) - - def set_subdev(self, subdev_spec): - if subdev_spec is None: - subdev_spec = self.pick_subdevice() - self._subdev = usrp.selected_subdev(self._u, subdev_spec) - self._u.set_mux(usrp.determine_rx_mux_value(self._u, subdev_spec)) - if self._verbose: - print 'RX using', self._subdev.name(), 'daughterboard' - - def pick_subdevice(self): - """ - The user didn't specify a subdevice. - If there's a daughterboard on A, select A. - If there's a daughterboard on B, select B. - Otherwise, select A. - """ - if self._u.db[0][0].dbid() >= 0: # dbid is < 0 if there's no d'board or a problem - return (0, 0) - if self._u.db[1][0].dbid() >= 0: - return (1, 0) - return (0, 0) - - def set_if_rate(self, if_rate): - # If no IF rate specified, set to maximum decimation - if if_rate is None: - self._decim = 256 - else: - self._decim = int(self._u.adc_rate()/if_rate) - - self._u.set_decim_rate(self._decim) - self._if_rate = self._u.adc_rate()/self._decim - - if self._verbose: - print "USRP decimation rate is", self._decim - print "USRP IF rate is", n2s(self._if_rate), "sps" - - def set_gain(self, gain): - # If no gain specified, set to midrange - if gain is None: - g = self._subdev.gain_range() - gain = (g[0]+g[1])/2.0 - self._gain = gain - self._subdev.set_gain(self._gain) - if self._verbose: - print "USRP gain set to", self._gain - - def set_calibration(self, calibration): - self._cal = calibration - if self._verbose: - print "Using frequency calibration offset of", n2s(calibration), "Hz" - - def tune(self, freq): - """ - Set the center frequency we're interested in. - - @param target_freq: frequency in Hz - @type: bool - - Tuning is a two step process. First we ask the front-end to - tune as close to the desired frequency as it can. Then we use - the result of that operation and our target_frequency to - determine the value for the digital down converter. - """ - self._tune_result = usrp.tune(self._u, 0, self._subdev, freq+self._cal) - if self._tune_result: - if self._verbose: - print "Baseband frequency is", n2s(self._tune_result.baseband_freq), "Hz" - print "DXC frequency is", n2s(self._tune_result.dxc_freq), "Hz" - print "Center frequency is", n2s(freq), "Hz" - print "Residual frequency is", n2s(self._tune_result.residual_freq), "Hz" - return True - - return False - -if __name__ == '__main__': - src = usrp_source_c(verbose=True) diff --git a/gnuradio-examples/python/usrp/limbo/am_rcv.py b/gnuradio-examples/python/usrp/limbo/am_rcv.py deleted file mode 100755 index 2908dcbf..00000000 --- a/gnuradio-examples/python/usrp/limbo/am_rcv.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python - -from gnuradio import gr, eng_notation -from gnuradio import audio -from gnuradio import usrp -from gnuradio.eng_option import eng_option -from optparse import OptionParser -import sys -import math - -from gnuradio.wxgui import stdgui, fftsink -import wx - -class am_rx_graph (stdgui.gui_flow_graph): - def __init__(self,frame,panel,vbox,argv): - stdgui.gui_flow_graph.__init__ (self,frame,panel,vbox,argv) - - station = parseargs(argv[1:]) - offset_freq = 30e3 - IF_freq = offset_freq - station - - adc_rate = 64e6 - usrp_decim = 250 - if_rate = adc_rate / usrp_decim # 256 kHz - if_decim = 4 - demod_rate = if_rate / if_decim # 64 kHz - audio_decimation = 2 - audio_rate = demod_rate / audio_decimation # 16 kHz - - # usrp is data source - src = usrp.source_c (0, usrp_decim) - src.set_rx_freq (0, IF_freq) - actual_IF_freq =src.rx_freq(0) - actual_offset = actual_IF_freq + station - - #print actual_IF_freq - #print actual_offset - - src.set_pga(0,20) - # sound card as final sink - audio_sink = audio.sink (int (audio_rate)) - - channel_coeffs = \ - gr.firdes.low_pass (1.0, # gain - if_rate, # sampling rate - 9e3, # low pass cutoff freq - 10e3, # width of trans. band - gr.firdes.WIN_HANN) - - ddc = gr.freq_xlating_fir_filter_ccf (if_decim,channel_coeffs,-actual_offset,if_rate) - - magblock = gr.complex_to_mag() - volumecontrol = gr.multiply_const_ff(.003) - - # Deemphasis. Is this necessary on AM? - TAU = 75e-6 # 75us in US, 50us in EUR - fftaps = [ 1 - math.exp(-1/TAU/if_rate), 0] - fbtaps= [ 0 , math.exp(-1/TAU/if_rate) ] - - deemph = gr.iir_filter_ffd(fftaps,fbtaps) - - # compute FIR filter taps for audio filter - width_of_transition_band = audio_rate / 8 - audio_coeffs = gr.firdes.low_pass (1.0, # gain - if_rate, # sampling rate - 9e3, #audio_rate/2 - width_of_transition_band, - 4e3, # width_of_transition_band, - gr.firdes.WIN_HANN) - - # input: float; output: float - audio_filter = gr.fir_filter_fff (audio_decimation, audio_coeffs) - - - - - print len(channel_coeffs) - print len(audio_coeffs) - - # now wire it all together - self.connect (src, ddc) - self.connect (ddc, magblock) - self.connect (magblock, volumecontrol) - self.connect (volumecontrol,deemph) - self.connect (deemph,audio_filter) - self.connect (audio_filter, (audio_sink, 0)) - - if 1: - pre_demod = fftsink.fft_sink_c (self, panel, title="Pre-Demodulation", fft_size=128, sample_rate=if_rate) - self.connect (src, pre_demod) - vbox.Add (pre_demod.win, 1, wx.EXPAND) - - if 0: - post_demod = fftsink.fft_sink_c (self, panel, title="Post Demodulation", fft_size=256, sample_rate=demod_rate) - self.connect (ddc, post_demod) - vbox.Add (post_demod.win, 1, wx.EXPAND) - - if 0: - post_filt = fftsink.fft_sink_f (self, panel, title="Post Filter", fft_size=512, sample_rate=audio_rate) - self.connect (magblock,post_filt) - vbox.Add (post_filt.win, 1, wx.EXPAND) - -def parseargs (args): - nargs = len (args) - if nargs == 1: - freq1 = float (args[0]) * 1e3 - else: - sys.stderr.write ('usage: am_rcv freq1\n') - sys.exit (1) - - return freq1 - -if __name__ == '__main__': - app = stdgui.stdapp (am_rx_graph, "AM RX") - app.MainLoop () - diff --git a/gnuradio-examples/python/usrp/limbo/ayfabtu.dat b/gnuradio-examples/python/usrp/limbo/ayfabtu.dat deleted file mode 100644 index 5c65cf48334a68c16a1f07193b3b02c0dbc27e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544640 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 z 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