diff --git a/README.md b/README.md index e73b56a..3f659a8 100644 --- a/README.md +++ b/README.md @@ -25,4 +25,26 @@ The transmit side is designed to run on a Raspberry Pi, and the UART (/dev/ttyAM ### RX Testing * `rx_tester.py` produces a stream of packets on stdout, as would be received from the fsk_demod modem (from codec2 - still under development). * Run `python rx_tester.py | python rx_ssdv.py` to feed these test packets into the command-line ssdv rx script. - * add `--partialupdate N` to the above command to have rx_gui.py update every N received packets. \ No newline at end of file + * add `--partialupdate N` to the above command to have rx_gui.py update every N received packets. + +## Sending/Receiving Images +### TX Site +* Run either `python tx_picam.py` (might need sudo) or `python tx_test_images.py` on the transmitter Raspberry Pi. + +### RX Side +To be able to run a full receive chain, from SDR through to images, you'll need: +* GnuRadio + libraries for whatever SDR you plan on using. +* `fsk_demod` and `drs232` from codec2-dev. You can get these using + * `svn checkout http://svn.code.sf.net/p/freetel/code/codec2-dev/` + * `cd codec2-dev && mkdir build-linux && cd build-linux && cmake ../` + * Build `drs232` using `gcc src/drs232.c -o src/drs232 -Wall` + * Then copy `src/fsk_demod` and `src/drs232` to this directory. + +* A few example gnuradio-companion flow-graphs are in the `grc` directory, for different SDRs. These receive samples from the SDR, demodulate a 500KHz section of spectrum as USB, resamples them to fsbaud*8 (which fsk_demod requires), then presents these samples via a TCP sink, which is acting as a TCP server. You will probably need to modify these to set the appropriate receive frequency. + +* To receive the FSK data and display the images 'live', run: + * In another terminal: `python rx_gui.py`, which will listen via UDP for new images to display. + * Start the appropriate GNURadio Companion Flowgraph. This will block until a client connects to the TCP Sinks TCP socket. + * Start the FSK modem with: + * `nc localhost 9898 | ./fsk_demod 2X 8 921600 115200 - - | ./drs232 - - | python rx_ssdv.py --partialupdate 8` + diff --git a/grc/usb_demod_fcdpp.grc b/grc/usb_demod_fcdpp.grc new file mode 100644 index 0000000..0057932 --- /dev/null +++ b/grc/usb_demod_fcdpp.grc @@ -0,0 +1,1176 @@ + + + + Tue Feb 23 21:53:55 2016 + + options + + id + usb_demod_rtlsdr + + + _enabled + True + + + title + + + + author + + + + description + + + + window_size + 1280, 1024 + + + generate_options + wx_gui + + + category + Custom + + + run_options + prompt + + + run + True + + + max_nouts + 0 + + + realtime_scheduling + + + + alias + + + + _coordinate + (10, 10) + + + _rotation + 0 + + + + variable + + id + out_samp_rate + + + _enabled + True + + + value + 0.9216e6 + + + alias + + + + _coordinate + (280, 491) + + + _rotation + 0 + + + + variable + + id + samp_rate + + + _enabled + True + + + value + 0.192e6 + + + alias + + + + _coordinate + (10, 170) + + + _rotation + 0 + + + + variable_slider + + id + gain + + + _enabled + True + + + label + + + + value + 25 + + + min + 0 + + + max + 50 + + + num_steps + 125 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + + + + notebook + + + + alias + + + + _coordinate + (11, 270) + + + _rotation + 0 + + + + blocks_complex_to_real + + id + blocks_complex_to_real_0 + + + _enabled + True + + + vlen + 1 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (696, 464) + + + _rotation + 0 + + + + variable_slider + + id + freq + + + _enabled + True + + + label + Frequency + + + value + 441.2e6 + + + min + 435e6 + + + max + 445e6 + + + num_steps + 1000 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + + + + notebook + + + + alias + + + + _coordinate + (16, 515) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_1 + + + _enabled + True + + + type + float + + + title + SSB Demod + + + samp_rate + out_samp_rate + + + baseband_freq + 0 + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_size + 1024 + + + fft_rate + 15 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + win + None + + + win_size + + + + grid_pos + + + + notebook + + + + freqvar + None + + + alias + + + + affinity + + + + _coordinate + (1040, 315) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_0 + + + _enabled + True + + + type + complex + + + title + Spectrum + + + samp_rate + samp_rate + + + baseband_freq + 0 + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_size + 1024 + + + fft_rate + 15 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + win + None + + + win_size + + + + grid_pos + + + + notebook + + + + freqvar + None + + + alias + + + + affinity + + + + _coordinate + (784, 11) + + + _rotation + 0 + + + + blocks_multiply_xx + + id + blocks_multiply_xx_0 + + + _enabled + True + + + type + complex + + + num_inputs + 2 + + + vlen + 1 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (456, 328) + + + _rotation + 0 + + + + rational_resampler_xxx + + id + rational_resampler_xxx_0 + + + _enabled + True + + + type + ccc + + + interp + 8 + + + decim + 1 + + + taps + + + + fbw + 0 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (224, 251) + + + _rotation + 0 + + + + band_pass_filter + + id + band_pass_filter_0 + + + _enabled + True + + + type + fir_filter_ccc + + + decim + 1 + + + interp + 1 + + + gain + 1 + + + samp_rate + samp_rate*8 + + + low_cutoff_freq + 50000 + + + high_cutoff_freq + 450000 + + + width + 50000 + + + win + firdes.WIN_HAMMING + + + beta + 6.76 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (584, 179) + + + _rotation + 0 + + + + analog_sig_source_x + + id + analog_sig_source_x_3 + + + _enabled + True + + + type + complex + + + samp_rate + samp_rate*8 + + + waveform + analog.GR_COS_WAVE + + + freq + samp_rate + + + amp + 1 + + + offset + 0 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (240, 355) + + + _rotation + 0 + + + + pfb_arb_resampler_xxx + + id + pfb_arb_resampler_xxx_0 + + + _enabled + True + + + type + ccf + + + rrate + out_samp_rate/(samp_rate*8) + + + taps + + + + nfilts + 32 + + + atten + 100 + + + samp_delay + 0 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (776, 243) + + + _rotation + 0 + + + + fcdproplus_fcdproplus + + id + fcdproplus_fcdproplus_0 + + + _enabled + True + + + device_name + plughw:CARD=V20,DEV=0 + + + unit + 1 + + + lnaswitch + 1 + + + mixergainswitch + 1 + + + freq + freq + + + ppm + 0 + + + if_gain + 40 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (176, 75) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0 + + + _enabled + False + + + type + float + + + title + Scope Plot + + + samp_rate + samp_rate/4 + + + v_scale + 0 + + + v_offset + 0 + + + t_scale + 0 + + + ac_couple + False + + + xy_mode + False + + + num_inputs + 1 + + + win_size + + + + grid_pos + + + + notebook + + + + trig_mode + wxgui.TRIG_MODE_AUTO + + + y_axis_label + Counts + + + alias + + + + affinity + + + + _coordinate + (1048, 771) + + + _rotation + 0 + + + + blocks_short_to_float + + id + blocks_short_to_float_0 + + + _enabled + False + + + vlen + 1 + + + scale + 1 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (880, 811) + + + _rotation + 0 + + + + blocks_file_sink + + id + blocks_file_sink_0 + + + _enabled + False + + + file + /tmp/fsktest + + + type + short + + + vlen + 1 + + + unbuffered + False + + + append + False + + + alias + + + + affinity + + + + _coordinate + (1048, 659) + + + _rotation + 0 + + + + blocks_float_to_short + + id + blocks_float_to_short_0 + + + _enabled + True + + + vlen + 1 + + + scale + 32768 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (872, 587) + + + _rotation + 0 + + + + blks2_tcp_sink + + id + blks2_tcp_sink_0 + + + _enabled + True + + + type + short + + + addr + 127.0.0.1 + + + port + 9898 + + + server + True + + + vlen + 1 + + + alias + + + + affinity + + + + _coordinate + (1056, 539) + + + _rotation + 0 + + + + blocks_float_to_short_0 + blocks_file_sink_0 + 0 + 0 + + + pfb_arb_resampler_xxx_0 + blocks_complex_to_real_0 + 0 + 0 + + + blocks_complex_to_real_0 + wxgui_fftsink2_1 + 0 + 0 + + + blocks_short_to_float_0 + wxgui_scopesink2_0 + 0 + 0 + + + blocks_complex_to_real_0 + blocks_float_to_short_0 + 0 + 0 + + + blocks_float_to_short_0 + blocks_short_to_float_0 + 0 + 0 + + + fcdproplus_fcdproplus_0 + wxgui_fftsink2_0 + 0 + 0 + + + analog_sig_source_x_3 + blocks_multiply_xx_0 + 0 + 1 + + + fcdproplus_fcdproplus_0 + rational_resampler_xxx_0 + 0 + 0 + + + rational_resampler_xxx_0 + blocks_multiply_xx_0 + 0 + 0 + + + blocks_multiply_xx_0 + band_pass_filter_0 + 0 + 0 + + + band_pass_filter_0 + pfb_arb_resampler_xxx_0 + 0 + 0 + + + blocks_float_to_short_0 + blks2_tcp_sink_0 + 0 + 0 + + diff --git a/grc/usb_demod_hackrf.grc b/grc/usb_demod_hackrf.grc new file mode 100644 index 0000000..4d1bd3b --- /dev/null +++ b/grc/usb_demod_hackrf.grc @@ -0,0 +1,2310 @@ + + + + Tue Feb 23 21:53:55 2016 + + options + + id + usb + + + _enabled + True + + + title + + + + author + + + + description + + + + window_size + 1280, 1024 + + + generate_options + wx_gui + + + category + Custom + + + run_options + prompt + + + run + True + + + max_nouts + 0 + + + realtime_scheduling + + + + alias + + + + _coordinate + (10, 10) + + + _rotation + 0 + + + + variable + + id + samp_rate + + + _enabled + True + + + value + 4e6 + + + alias + + + + _coordinate + (10, 170) + + + _rotation + 0 + + + + variable_slider + + id + gain + + + _enabled + True + + + label + + + + value + 25 + + + min + 0 + + + max + 50 + + + num_steps + 125 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + + + + notebook + + + + alias + + + + _coordinate + (11, 270) + + + _rotation + 0 + + + + blocks_complex_to_real + + id + blocks_complex_to_real_0 + + + _enabled + True + + + vlen + 1 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (696, 464) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_1 + + + _enabled + True + + + type + float + + + title + SSB Demod + + + samp_rate + samp_rate/4 + + + baseband_freq + 0 + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_size + 1024 + + + fft_rate + 15 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + win + None + + + win_size + + + + grid_pos + + + + notebook + + + + freqvar + None + + + alias + + + + affinity + + + + _coordinate + (1040, 315) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_0 + + + _enabled + True + + + type + complex + + + title + Spectrum + + + samp_rate + samp_rate + + + baseband_freq + 0 + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_size + 1024 + + + fft_rate + 15 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + win + None + + + win_size + + + + grid_pos + + + + notebook + + + + freqvar + None + + + alias + + + + affinity + + + + _coordinate + (560, 11) + + + _rotation + 0 + + + + band_pass_filter + + id + band_pass_filter_0 + + + _enabled + True + + + type + fir_filter_ccc + + + decim + 4 + + + interp + 1 + + + gain + 1 + + + samp_rate + samp_rate + + + low_cutoff_freq + 50000 + + + high_cutoff_freq + 450000 + + + width + 50000 + + + win + firdes.WIN_HAMMING + + + beta + 6.76 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (560, 211) + + + _rotation + 0 + + + + pfb_arb_resampler_xxx + + id + pfb_arb_resampler_xxx_0 + + + _enabled + True + + + type + ccf + + + rrate + 0.9216 + + + taps + + + + nfilts + 32 + + + atten + 100 + + + samp_delay + 0 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (368, 435) + + + _rotation + 0 + + + + osmosdr_source + + id + osmosdr_source_0 + + + _enabled + True + + + type + fc32 + + + args + + + + sync + + + + num_mboards + 1 + + + clock_source0 + + + + time_source0 + + + + clock_source1 + + + + time_source1 + + + + clock_source2 + + + + time_source2 + + + + clock_source3 + + + + time_source3 + + + + clock_source4 + + + + time_source4 + + + + clock_source5 + + + + time_source5 + + + + clock_source6 + + + + time_source6 + + + + clock_source7 + + + + time_source7 + + + + nchan + 1 + + + sample_rate + samp_rate + + + freq0 + freq + + + corr0 + 0 + + + dc_offset_mode0 + 0 + + + iq_balance_mode0 + 0 + + + gain_mode0 + False + + + gain0 + 30 + + + if_gain0 + 20 + + + bb_gain0 + 20 + + + ant0 + + + + bw0 + 0 + + + freq1 + 100e6 + + + corr1 + 0 + + + dc_offset_mode1 + 0 + + + iq_balance_mode1 + 0 + + + gain_mode1 + False + + + gain1 + 10 + + + if_gain1 + 20 + + + bb_gain1 + 20 + + + ant1 + + + + bw1 + 0 + + + freq2 + 100e6 + + + corr2 + 0 + + + dc_offset_mode2 + 0 + + + iq_balance_mode2 + 0 + + + gain_mode2 + False + + + gain2 + 10 + + + if_gain2 + 20 + + + bb_gain2 + 20 + + + ant2 + + + + bw2 + 0 + + + freq3 + 100e6 + + + corr3 + 0 + + + dc_offset_mode3 + 0 + + + iq_balance_mode3 + 0 + + + gain_mode3 + False + + + gain3 + 10 + + + if_gain3 + 20 + + + bb_gain3 + 20 + + + ant3 + + + + bw3 + 0 + + + freq4 + 100e6 + + + corr4 + 0 + + + dc_offset_mode4 + 0 + + + iq_balance_mode4 + 0 + + + gain_mode4 + False + + + gain4 + 10 + + + if_gain4 + 20 + + + bb_gain4 + 20 + + + ant4 + + + + bw4 + 0 + + + freq5 + 100e6 + + + corr5 + 0 + + + dc_offset_mode5 + 0 + + + iq_balance_mode5 + 0 + + + gain_mode5 + False + + + gain5 + 10 + + + if_gain5 + 20 + + + bb_gain5 + 20 + + + ant5 + + + + bw5 + 0 + + + freq6 + 100e6 + + + corr6 + 0 + + + dc_offset_mode6 + 0 + + + iq_balance_mode6 + 0 + + + gain_mode6 + False + + + gain6 + 10 + + + if_gain6 + 20 + + + bb_gain6 + 20 + + + ant6 + + + + bw6 + 0 + + + freq7 + 100e6 + + + corr7 + 0 + + + dc_offset_mode7 + 0 + + + iq_balance_mode7 + 0 + + + gain_mode7 + False + + + gain7 + 10 + + + if_gain7 + 20 + + + bb_gain7 + 20 + + + ant7 + + + + bw7 + 0 + + + freq8 + 100e6 + + + corr8 + 0 + + + dc_offset_mode8 + 0 + + + iq_balance_mode8 + 0 + + + gain_mode8 + False + + + gain8 + 10 + + + if_gain8 + 20 + + + bb_gain8 + 20 + + + ant8 + + + + bw8 + 0 + + + freq9 + 100e6 + + + corr9 + 0 + + + dc_offset_mode9 + 0 + + + iq_balance_mode9 + 0 + + + gain_mode9 + False + + + gain9 + 10 + + + if_gain9 + 20 + + + bb_gain9 + 20 + + + ant9 + + + + bw9 + 0 + + + freq10 + 100e6 + + + corr10 + 0 + + + dc_offset_mode10 + 0 + + + iq_balance_mode10 + 0 + + + gain_mode10 + False + + + gain10 + 10 + + + if_gain10 + 20 + + + bb_gain10 + 20 + + + ant10 + + + + bw10 + 0 + + + freq11 + 100e6 + + + corr11 + 0 + + + dc_offset_mode11 + 0 + + + iq_balance_mode11 + 0 + + + gain_mode11 + False + + + gain11 + 10 + + + if_gain11 + 20 + + + bb_gain11 + 20 + + + ant11 + + + + bw11 + 0 + + + freq12 + 100e6 + + + corr12 + 0 + + + dc_offset_mode12 + 0 + + + iq_balance_mode12 + 0 + + + gain_mode12 + False + + + gain12 + 10 + + + if_gain12 + 20 + + + bb_gain12 + 20 + + + ant12 + + + + bw12 + 0 + + + freq13 + 100e6 + + + corr13 + 0 + + + dc_offset_mode13 + 0 + + + iq_balance_mode13 + 0 + + + gain_mode13 + False + + + gain13 + 10 + + + if_gain13 + 20 + + + bb_gain13 + 20 + + + ant13 + + + + bw13 + 0 + + + freq14 + 100e6 + + + corr14 + 0 + + + dc_offset_mode14 + 0 + + + iq_balance_mode14 + 0 + + + gain_mode14 + False + + + gain14 + 10 + + + if_gain14 + 20 + + + bb_gain14 + 20 + + + ant14 + + + + bw14 + 0 + + + freq15 + 100e6 + + + corr15 + 0 + + + dc_offset_mode15 + 0 + + + iq_balance_mode15 + 0 + + + gain_mode15 + False + + + gain15 + 10 + + + if_gain15 + 20 + + + bb_gain15 + 20 + + + ant15 + + + + bw15 + 0 + + + freq16 + 100e6 + + + corr16 + 0 + + + dc_offset_mode16 + 0 + + + iq_balance_mode16 + 0 + + + gain_mode16 + False + + + gain16 + 10 + + + if_gain16 + 20 + + + bb_gain16 + 20 + + + ant16 + + + + bw16 + 0 + + + freq17 + 100e6 + + + corr17 + 0 + + + dc_offset_mode17 + 0 + + + iq_balance_mode17 + 0 + + + gain_mode17 + False + + + gain17 + 10 + + + if_gain17 + 20 + + + bb_gain17 + 20 + + + ant17 + + + + bw17 + 0 + + + freq18 + 100e6 + + + corr18 + 0 + + + dc_offset_mode18 + 0 + + + iq_balance_mode18 + 0 + + + gain_mode18 + False + + + gain18 + 10 + + + if_gain18 + 20 + + + bb_gain18 + 20 + + + ant18 + + + + bw18 + 0 + + + freq19 + 100e6 + + + corr19 + 0 + + + dc_offset_mode19 + 0 + + + iq_balance_mode19 + 0 + + + gain_mode19 + False + + + gain19 + 10 + + + if_gain19 + 20 + + + bb_gain19 + 20 + + + ant19 + + + + bw19 + 0 + + + freq20 + 100e6 + + + corr20 + 0 + + + dc_offset_mode20 + 0 + + + iq_balance_mode20 + 0 + + + gain_mode20 + False + + + gain20 + 10 + + + if_gain20 + 20 + + + bb_gain20 + 20 + + + ant20 + + + + bw20 + 0 + + + freq21 + 100e6 + + + corr21 + 0 + + + dc_offset_mode21 + 0 + + + iq_balance_mode21 + 0 + + + gain_mode21 + False + + + gain21 + 10 + + + if_gain21 + 20 + + + bb_gain21 + 20 + + + ant21 + + + + bw21 + 0 + + + freq22 + 100e6 + + + corr22 + 0 + + + dc_offset_mode22 + 0 + + + iq_balance_mode22 + 0 + + + gain_mode22 + False + + + gain22 + 10 + + + if_gain22 + 20 + + + bb_gain22 + 20 + + + ant22 + + + + bw22 + 0 + + + freq23 + 100e6 + + + corr23 + 0 + + + dc_offset_mode23 + 0 + + + iq_balance_mode23 + 0 + + + gain_mode23 + False + + + gain23 + 10 + + + if_gain23 + 20 + + + bb_gain23 + 20 + + + ant23 + + + + bw23 + 0 + + + freq24 + 100e6 + + + corr24 + 0 + + + dc_offset_mode24 + 0 + + + iq_balance_mode24 + 0 + + + gain_mode24 + False + + + gain24 + 10 + + + if_gain24 + 20 + + + bb_gain24 + 20 + + + ant24 + + + + bw24 + 0 + + + freq25 + 100e6 + + + corr25 + 0 + + + dc_offset_mode25 + 0 + + + iq_balance_mode25 + 0 + + + gain_mode25 + False + + + gain25 + 10 + + + if_gain25 + 20 + + + bb_gain25 + 20 + + + ant25 + + + + bw25 + 0 + + + freq26 + 100e6 + + + corr26 + 0 + + + dc_offset_mode26 + 0 + + + iq_balance_mode26 + 0 + + + gain_mode26 + False + + + gain26 + 10 + + + if_gain26 + 20 + + + bb_gain26 + 20 + + + ant26 + + + + bw26 + 0 + + + freq27 + 100e6 + + + corr27 + 0 + + + dc_offset_mode27 + 0 + + + iq_balance_mode27 + 0 + + + gain_mode27 + False + + + gain27 + 10 + + + if_gain27 + 20 + + + bb_gain27 + 20 + + + ant27 + + + + bw27 + 0 + + + freq28 + 100e6 + + + corr28 + 0 + + + dc_offset_mode28 + 0 + + + iq_balance_mode28 + 0 + + + gain_mode28 + False + + + gain28 + 10 + + + if_gain28 + 20 + + + bb_gain28 + 20 + + + ant28 + + + + bw28 + 0 + + + freq29 + 100e6 + + + corr29 + 0 + + + dc_offset_mode29 + 0 + + + iq_balance_mode29 + 0 + + + gain_mode29 + False + + + gain29 + 10 + + + if_gain29 + 20 + + + bb_gain29 + 20 + + + ant29 + + + + bw29 + 0 + + + freq30 + 100e6 + + + corr30 + 0 + + + dc_offset_mode30 + 0 + + + iq_balance_mode30 + 0 + + + gain_mode30 + False + + + gain30 + 10 + + + if_gain30 + 20 + + + bb_gain30 + 20 + + + ant30 + + + + bw30 + 0 + + + freq31 + 100e6 + + + corr31 + 0 + + + dc_offset_mode31 + 0 + + + iq_balance_mode31 + 0 + + + gain_mode31 + False + + + gain31 + 10 + + + if_gain31 + 20 + + + bb_gain31 + 20 + + + ant31 + + + + bw31 + 0 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (224, 75) + + + _rotation + 0 + + + + variable_slider + + id + freq + + + _enabled + True + + + label + Frequency + + + value + 441.0e6 + + + min + 435e6 + + + max + 445e6 + + + num_steps + 1000 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + + + + notebook + + + + alias + + + + _coordinate + (16, 515) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0 + + + _enabled + False + + + type + float + + + title + Scope Plot + + + samp_rate + samp_rate/4 + + + v_scale + 0 + + + v_offset + 0 + + + t_scale + 0 + + + ac_couple + False + + + xy_mode + False + + + num_inputs + 1 + + + win_size + + + + grid_pos + + + + notebook + + + + trig_mode + wxgui.TRIG_MODE_AUTO + + + y_axis_label + Counts + + + alias + + + + affinity + + + + _coordinate + (1048, 843) + + + _rotation + 0 + + + + blocks_short_to_float + + id + blocks_short_to_float_0 + + + _enabled + False + + + vlen + 1 + + + scale + 1 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (872, 867) + + + _rotation + 0 + + + + blocks_file_sink + + id + blocks_file_sink_0 + + + _enabled + False + + + file + /tmp/fsktest + + + type + short + + + vlen + 1 + + + unbuffered + False + + + append + False + + + alias + + + + affinity + + + + _coordinate + (1048, 683) + + + _rotation + 0 + + + + blocks_float_to_short + + id + blocks_float_to_short_0 + + + _enabled + True + + + vlen + 1 + + + scale + 32768 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (872, 587) + + + _rotation + 0 + + + + blks2_tcp_sink + + id + blks2_tcp_sink_0 + + + _enabled + True + + + type + short + + + addr + 127.0.0.1 + + + port + 9898 + + + server + True + + + vlen + 1 + + + alias + + + + affinity + + + + _coordinate + (1072, 571) + + + _rotation + 0 + + + + osmosdr_source_0 + wxgui_fftsink2_0 + 0 + 0 + + + blocks_float_to_short_0 + blocks_file_sink_0 + 0 + 0 + + + band_pass_filter_0 + pfb_arb_resampler_xxx_0 + 0 + 0 + + + pfb_arb_resampler_xxx_0 + blocks_complex_to_real_0 + 0 + 0 + + + blocks_complex_to_real_0 + wxgui_fftsink2_1 + 0 + 0 + + + blocks_short_to_float_0 + wxgui_scopesink2_0 + 0 + 0 + + + osmosdr_source_0 + band_pass_filter_0 + 0 + 0 + + + blocks_complex_to_real_0 + blocks_float_to_short_0 + 0 + 0 + + + blocks_float_to_short_0 + blocks_short_to_float_0 + 0 + 0 + + + blocks_float_to_short_0 + blks2_tcp_sink_0 + 0 + 0 + + diff --git a/grc/usb_demod_rtlsdr.grc b/grc/usb_demod_rtlsdr.grc new file mode 100644 index 0000000..5971282 --- /dev/null +++ b/grc/usb_demod_rtlsdr.grc @@ -0,0 +1,2310 @@ + + + + Tue Feb 23 21:53:55 2016 + + options + + id + usb_demod_rtlsdr + + + _enabled + True + + + title + + + + author + + + + description + + + + window_size + 1280, 1024 + + + generate_options + wx_gui + + + category + Custom + + + run_options + prompt + + + run + True + + + max_nouts + 0 + + + realtime_scheduling + + + + alias + + + + _coordinate + (10, 10) + + + _rotation + 0 + + + + variable + + id + samp_rate + + + _enabled + True + + + value + 2e6 + + + alias + + + + _coordinate + (10, 170) + + + _rotation + 0 + + + + variable_slider + + id + gain + + + _enabled + True + + + label + + + + value + 25 + + + min + 0 + + + max + 50 + + + num_steps + 125 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + + + + notebook + + + + alias + + + + _coordinate + (11, 270) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_0 + + + _enabled + True + + + type + complex + + + title + Spectrum + + + samp_rate + samp_rate + + + baseband_freq + 0 + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_size + 1024 + + + fft_rate + 15 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + win + None + + + win_size + + + + grid_pos + + + + notebook + + + + freqvar + None + + + alias + + + + affinity + + + + _coordinate + (560, 11) + + + _rotation + 0 + + + + blocks_short_to_float + + id + blocks_short_to_float_0 + + + _enabled + False + + + vlen + 1 + + + scale + 1 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (880, 731) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0 + + + _enabled + False + + + type + float + + + title + Scope Plot + + + samp_rate + samp_rate/4 + + + v_scale + 0 + + + v_offset + 0 + + + t_scale + 0 + + + ac_couple + False + + + xy_mode + False + + + num_inputs + 1 + + + win_size + + + + grid_pos + + + + notebook + + + + trig_mode + wxgui.TRIG_MODE_AUTO + + + y_axis_label + Counts + + + alias + + + + affinity + + + + _coordinate + (1048, 699) + + + _rotation + 0 + + + + variable_slider + + id + freq + + + _enabled + True + + + label + Frequency + + + value + 440.960e6 + + + min + 435e6 + + + max + 445e6 + + + num_steps + 1000 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + + + + notebook + + + + alias + + + + _coordinate + (16, 515) + + + _rotation + 0 + + + + osmosdr_source + + id + osmosdr_source_0 + + + _enabled + True + + + type + fc32 + + + args + + + + sync + + + + num_mboards + 1 + + + clock_source0 + + + + time_source0 + + + + clock_source1 + + + + time_source1 + + + + clock_source2 + + + + time_source2 + + + + clock_source3 + + + + time_source3 + + + + clock_source4 + + + + time_source4 + + + + clock_source5 + + + + time_source5 + + + + clock_source6 + + + + time_source6 + + + + clock_source7 + + + + time_source7 + + + + nchan + 1 + + + sample_rate + samp_rate + + + freq0 + freq + + + corr0 + 0 + + + dc_offset_mode0 + 0 + + + iq_balance_mode0 + 0 + + + gain_mode0 + True + + + gain0 + 30 + + + if_gain0 + 20 + + + bb_gain0 + 20 + + + ant0 + + + + bw0 + 0 + + + freq1 + 100e6 + + + corr1 + 0 + + + dc_offset_mode1 + 0 + + + iq_balance_mode1 + 0 + + + gain_mode1 + False + + + gain1 + 10 + + + if_gain1 + 20 + + + bb_gain1 + 20 + + + ant1 + + + + bw1 + 0 + + + freq2 + 100e6 + + + corr2 + 0 + + + dc_offset_mode2 + 0 + + + iq_balance_mode2 + 0 + + + gain_mode2 + False + + + gain2 + 10 + + + if_gain2 + 20 + + + bb_gain2 + 20 + + + ant2 + + + + bw2 + 0 + + + freq3 + 100e6 + + + corr3 + 0 + + + dc_offset_mode3 + 0 + + + iq_balance_mode3 + 0 + + + gain_mode3 + False + + + gain3 + 10 + + + if_gain3 + 20 + + + bb_gain3 + 20 + + + ant3 + + + + bw3 + 0 + + + freq4 + 100e6 + + + corr4 + 0 + + + dc_offset_mode4 + 0 + + + iq_balance_mode4 + 0 + + + gain_mode4 + False + + + gain4 + 10 + + + if_gain4 + 20 + + + bb_gain4 + 20 + + + ant4 + + + + bw4 + 0 + + + freq5 + 100e6 + + + corr5 + 0 + + + dc_offset_mode5 + 0 + + + iq_balance_mode5 + 0 + + + gain_mode5 + False + + + gain5 + 10 + + + if_gain5 + 20 + + + bb_gain5 + 20 + + + ant5 + + + + bw5 + 0 + + + freq6 + 100e6 + + + corr6 + 0 + + + dc_offset_mode6 + 0 + + + iq_balance_mode6 + 0 + + + gain_mode6 + False + + + gain6 + 10 + + + if_gain6 + 20 + + + bb_gain6 + 20 + + + ant6 + + + + bw6 + 0 + + + freq7 + 100e6 + + + corr7 + 0 + + + dc_offset_mode7 + 0 + + + iq_balance_mode7 + 0 + + + gain_mode7 + False + + + gain7 + 10 + + + if_gain7 + 20 + + + bb_gain7 + 20 + + + ant7 + + + + bw7 + 0 + + + freq8 + 100e6 + + + corr8 + 0 + + + dc_offset_mode8 + 0 + + + iq_balance_mode8 + 0 + + + gain_mode8 + False + + + gain8 + 10 + + + if_gain8 + 20 + + + bb_gain8 + 20 + + + ant8 + + + + bw8 + 0 + + + freq9 + 100e6 + + + corr9 + 0 + + + dc_offset_mode9 + 0 + + + iq_balance_mode9 + 0 + + + gain_mode9 + False + + + gain9 + 10 + + + if_gain9 + 20 + + + bb_gain9 + 20 + + + ant9 + + + + bw9 + 0 + + + freq10 + 100e6 + + + corr10 + 0 + + + dc_offset_mode10 + 0 + + + iq_balance_mode10 + 0 + + + gain_mode10 + False + + + gain10 + 10 + + + if_gain10 + 20 + + + bb_gain10 + 20 + + + ant10 + + + + bw10 + 0 + + + freq11 + 100e6 + + + corr11 + 0 + + + dc_offset_mode11 + 0 + + + iq_balance_mode11 + 0 + + + gain_mode11 + False + + + gain11 + 10 + + + if_gain11 + 20 + + + bb_gain11 + 20 + + + ant11 + + + + bw11 + 0 + + + freq12 + 100e6 + + + corr12 + 0 + + + dc_offset_mode12 + 0 + + + iq_balance_mode12 + 0 + + + gain_mode12 + False + + + gain12 + 10 + + + if_gain12 + 20 + + + bb_gain12 + 20 + + + ant12 + + + + bw12 + 0 + + + freq13 + 100e6 + + + corr13 + 0 + + + dc_offset_mode13 + 0 + + + iq_balance_mode13 + 0 + + + gain_mode13 + False + + + gain13 + 10 + + + if_gain13 + 20 + + + bb_gain13 + 20 + + + ant13 + + + + bw13 + 0 + + + freq14 + 100e6 + + + corr14 + 0 + + + dc_offset_mode14 + 0 + + + iq_balance_mode14 + 0 + + + gain_mode14 + False + + + gain14 + 10 + + + if_gain14 + 20 + + + bb_gain14 + 20 + + + ant14 + + + + bw14 + 0 + + + freq15 + 100e6 + + + corr15 + 0 + + + dc_offset_mode15 + 0 + + + iq_balance_mode15 + 0 + + + gain_mode15 + False + + + gain15 + 10 + + + if_gain15 + 20 + + + bb_gain15 + 20 + + + ant15 + + + + bw15 + 0 + + + freq16 + 100e6 + + + corr16 + 0 + + + dc_offset_mode16 + 0 + + + iq_balance_mode16 + 0 + + + gain_mode16 + False + + + gain16 + 10 + + + if_gain16 + 20 + + + bb_gain16 + 20 + + + ant16 + + + + bw16 + 0 + + + freq17 + 100e6 + + + corr17 + 0 + + + dc_offset_mode17 + 0 + + + iq_balance_mode17 + 0 + + + gain_mode17 + False + + + gain17 + 10 + + + if_gain17 + 20 + + + bb_gain17 + 20 + + + ant17 + + + + bw17 + 0 + + + freq18 + 100e6 + + + corr18 + 0 + + + dc_offset_mode18 + 0 + + + iq_balance_mode18 + 0 + + + gain_mode18 + False + + + gain18 + 10 + + + if_gain18 + 20 + + + bb_gain18 + 20 + + + ant18 + + + + bw18 + 0 + + + freq19 + 100e6 + + + corr19 + 0 + + + dc_offset_mode19 + 0 + + + iq_balance_mode19 + 0 + + + gain_mode19 + False + + + gain19 + 10 + + + if_gain19 + 20 + + + bb_gain19 + 20 + + + ant19 + + + + bw19 + 0 + + + freq20 + 100e6 + + + corr20 + 0 + + + dc_offset_mode20 + 0 + + + iq_balance_mode20 + 0 + + + gain_mode20 + False + + + gain20 + 10 + + + if_gain20 + 20 + + + bb_gain20 + 20 + + + ant20 + + + + bw20 + 0 + + + freq21 + 100e6 + + + corr21 + 0 + + + dc_offset_mode21 + 0 + + + iq_balance_mode21 + 0 + + + gain_mode21 + False + + + gain21 + 10 + + + if_gain21 + 20 + + + bb_gain21 + 20 + + + ant21 + + + + bw21 + 0 + + + freq22 + 100e6 + + + corr22 + 0 + + + dc_offset_mode22 + 0 + + + iq_balance_mode22 + 0 + + + gain_mode22 + False + + + gain22 + 10 + + + if_gain22 + 20 + + + bb_gain22 + 20 + + + ant22 + + + + bw22 + 0 + + + freq23 + 100e6 + + + corr23 + 0 + + + dc_offset_mode23 + 0 + + + iq_balance_mode23 + 0 + + + gain_mode23 + False + + + gain23 + 10 + + + if_gain23 + 20 + + + bb_gain23 + 20 + + + ant23 + + + + bw23 + 0 + + + freq24 + 100e6 + + + corr24 + 0 + + + dc_offset_mode24 + 0 + + + iq_balance_mode24 + 0 + + + gain_mode24 + False + + + gain24 + 10 + + + if_gain24 + 20 + + + bb_gain24 + 20 + + + ant24 + + + + bw24 + 0 + + + freq25 + 100e6 + + + corr25 + 0 + + + dc_offset_mode25 + 0 + + + iq_balance_mode25 + 0 + + + gain_mode25 + False + + + gain25 + 10 + + + if_gain25 + 20 + + + bb_gain25 + 20 + + + ant25 + + + + bw25 + 0 + + + freq26 + 100e6 + + + corr26 + 0 + + + dc_offset_mode26 + 0 + + + iq_balance_mode26 + 0 + + + gain_mode26 + False + + + gain26 + 10 + + + if_gain26 + 20 + + + bb_gain26 + 20 + + + ant26 + + + + bw26 + 0 + + + freq27 + 100e6 + + + corr27 + 0 + + + dc_offset_mode27 + 0 + + + iq_balance_mode27 + 0 + + + gain_mode27 + False + + + gain27 + 10 + + + if_gain27 + 20 + + + bb_gain27 + 20 + + + ant27 + + + + bw27 + 0 + + + freq28 + 100e6 + + + corr28 + 0 + + + dc_offset_mode28 + 0 + + + iq_balance_mode28 + 0 + + + gain_mode28 + False + + + gain28 + 10 + + + if_gain28 + 20 + + + bb_gain28 + 20 + + + ant28 + + + + bw28 + 0 + + + freq29 + 100e6 + + + corr29 + 0 + + + dc_offset_mode29 + 0 + + + iq_balance_mode29 + 0 + + + gain_mode29 + False + + + gain29 + 10 + + + if_gain29 + 20 + + + bb_gain29 + 20 + + + ant29 + + + + bw29 + 0 + + + freq30 + 100e6 + + + corr30 + 0 + + + dc_offset_mode30 + 0 + + + iq_balance_mode30 + 0 + + + gain_mode30 + False + + + gain30 + 10 + + + if_gain30 + 20 + + + bb_gain30 + 20 + + + ant30 + + + + bw30 + 0 + + + freq31 + 100e6 + + + corr31 + 0 + + + dc_offset_mode31 + 0 + + + iq_balance_mode31 + 0 + + + gain_mode31 + False + + + gain31 + 10 + + + if_gain31 + 20 + + + bb_gain31 + 20 + + + ant31 + + + + bw31 + 0 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (224, 75) + + + _rotation + 0 + + + + blocks_float_to_short + + id + blocks_float_to_short_0 + + + _enabled + True + + + vlen + 1 + + + scale + 32768 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (872, 587) + + + _rotation + 0 + + + + band_pass_filter + + id + band_pass_filter_0 + + + _enabled + True + + + type + fir_filter_ccc + + + decim + 2 + + + interp + 1 + + + gain + 1 + + + samp_rate + samp_rate + + + low_cutoff_freq + 50000 + + + high_cutoff_freq + 450000 + + + width + 50000 + + + win + firdes.WIN_HAMMING + + + beta + 6.76 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (560, 211) + + + _rotation + 0 + + + + pfb_arb_resampler_xxx + + id + pfb_arb_resampler_xxx_0 + + + _enabled + True + + + type + ccf + + + rrate + 0.9216 + + + taps + + + + nfilts + 32 + + + atten + 100 + + + samp_delay + 0 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (368, 435) + + + _rotation + 0 + + + + wxgui_fftsink2 + + id + wxgui_fftsink2_1 + + + _enabled + True + + + type + float + + + title + SSB Demod + + + samp_rate + samp_rate/4 + + + baseband_freq + 0 + + + y_per_div + 10 + + + y_divs + 10 + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_size + 1024 + + + fft_rate + 15 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 + + + win + None + + + win_size + + + + grid_pos + + + + notebook + + + + freqvar + None + + + alias + + + + affinity + + + + _coordinate + (1040, 315) + + + _rotation + 0 + + + + blocks_complex_to_real + + id + blocks_complex_to_real_0 + + + _enabled + True + + + vlen + 1 + + + alias + + + + affinity + + + + minoutbuf + 0 + + + maxoutbuf + 0 + + + _coordinate + (696, 464) + + + _rotation + 0 + + + + blks2_tcp_sink + + id + blks2_tcp_sink_0 + + + _enabled + True + + + type + short + + + addr + 127.0.0.1 + + + port + 9898 + + + server + True + + + vlen + 1 + + + alias + + + + affinity + + + + _coordinate + (1080, 603) + + + _rotation + 0 + + + + blocks_file_sink + + id + blocks_file_sink_0 + + + _enabled + False + + + file + /tmp/fsktest + + + type + short + + + vlen + 1 + + + unbuffered + False + + + append + False + + + alias + + + + affinity + + + + _coordinate + (1072, 515) + + + _rotation + 0 + + + + osmosdr_source_0 + wxgui_fftsink2_0 + 0 + 0 + + + blocks_short_to_float_0 + wxgui_scopesink2_0 + 0 + 0 + + + osmosdr_source_0 + band_pass_filter_0 + 0 + 0 + + + band_pass_filter_0 + pfb_arb_resampler_xxx_0 + 0 + 0 + + + blocks_float_to_short_0 + blks2_tcp_sink_0 + 0 + 0 + + + blocks_float_to_short_0 + blocks_short_to_float_0 + 0 + 0 + + + blocks_complex_to_real_0 + blocks_float_to_short_0 + 0 + 0 + + + blocks_complex_to_real_0 + wxgui_fftsink2_1 + 0 + 0 + + + pfb_arb_resampler_xxx_0 + blocks_complex_to_real_0 + 0 + 0 + + + blocks_float_to_short_0 + blocks_file_sink_0 + 0 + 0 + + diff --git a/rx_ssdv.py b/rx_ssdv.py index 7803785..2c9231f 100644 --- a/rx_ssdv.py +++ b/rx_ssdv.py @@ -79,16 +79,16 @@ while True: # Attempt to decode current image, and write out to a file. temp_f.close() # Run SSDV - returncode = os.system("ssdv -d rxtemp.bin %s.jpg" % current_packet_time) + returncode = os.system("ssdv -d rxtemp.bin %s_%d.jpg" % (current_packet_time,current_image)) if returncode == 1: print("ERROR: SSDV Decode failed!") else: print("SSDV Decoded OK!") # Make a copy of the raw binary data. - os.system("mv rxtemp.bin %s.ssdv" % current_packet_time) + os.system("mv rxtemp.bin %s_%d.bin" % (current_packet_time,current_image)) # Update live displays here. - trigger_gui_update("%s.jpg" % current_packet_time) + trigger_gui_update("%s_%d.jpg" % (current_packet_time,current_image)) # Trigger upload to habhub here. else: diff --git a/rx_tester.py b/rx_tester.py index 28916eb..6265d9e 100644 --- a/rx_tester.py +++ b/rx_tester.py @@ -9,7 +9,7 @@ import time, sys, os # Set to whatever resolution you want to test. -file_path = "./test_images/%d_800x608.ssdv" # _raw, _800x608, _640x480, _320x240 +file_path = "./test_images/%d_raw.ssdv" # _raw, _800x608, _640x480, _320x240 image_numbers = xrange(1,14) print_as_hex = False diff --git a/tx_picam.py b/tx_picam.py new file mode 100644 index 0000000..5edc68d --- /dev/null +++ b/tx_picam.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# +# PiCam Transmitter Script +# Capture images from the PiCam, and transmit them, +# +# Mark Jessop +# + +import PacketTX, sys, os + +# Set to whatever resolution you want to transmit. +tx_resolution = "1024x768" +callsign = "VK5QI" + + +debug_output = False # If True, packet bits are saved to debug.bin as one char per bit. + +def transmit_file(filename, tx_object): + file_size = os.path.getsize(filename) + + if file_size % 256 > 0: + print("File size not a multiple of 256 bytes!") + return + + print("Transmitting %d Packets." % (file_size/256)) + + f = open(filename,'rb') + + for x in range(file_size/256): + data = f.read(256) + tx_object.tx_packet(data) + + f.close() + print("Waiting for tx queue to empty...") + tx_object.wait() + + +tx = PacketTX.PacketTX(debug=debug_output) +tx.start_tx() + +image_id = 0 + +try: + while True: + # Capture image using PiCam + print("Capturing Image...") + os.system("raspistill -t 100 -o temp.jpg -vf -hf -w 1024 -h 768") + # Resize using convert + print("Processing...") + #os.system("convert temp.jpg -resize %s\! temp.jpg" % tx_resolution) + # SSDV'ify the image. + os.system("ssdv -e -c %s -i %d temp.jpg temp.ssdv" % (callsign,image_id)) + # Transmit image + print("Transmitting...") + transmit_file("temp.ssdv",tx) + + # Increment Counter + image_id = (image_id+1)%256 +except KeyboardInterrupt: + print("Closing") + tx.close() diff --git a/tx_test_images.py b/tx_test_images.py index 8536a26..d39bb19 100644 --- a/tx_test_images.py +++ b/tx_test_images.py @@ -9,10 +9,10 @@ import PacketTX, sys, os # Set to whatever resolution you want to test. -file_path = "./test_images/%d_800x608.ssdv" # _raw, _800x608, _640x480, _320x240 +file_path = "./test_images/%d_320x240.ssdv" # _raw, _800x608, _640x480, _320x240 image_numbers = xrange(1,14) -debug_output = False # If True, packet bits are saved to debug.bin as one char per bit. +debug_output = True # If True, packet bits are saved to debug.bin as one char per bit. def transmit_file(filename, tx_object): file_size = os.path.getsize(filename)