diff options
-rw-r--r-- | comms/Makefile | 1 | ||||
-rw-r--r-- | comms/lysdr/Makefile | 33 | ||||
-rw-r--r-- | comms/lysdr/distinfo | 2 | ||||
-rw-r--r-- | comms/lysdr/files/Makefile | 15 | ||||
-rw-r--r-- | comms/lysdr/files/cexp.c | 46 | ||||
-rw-r--r-- | comms/lysdr/files/patch-audio_jack.c | 29 | ||||
-rw-r--r-- | comms/lysdr/files/patch-filter.c | 47 | ||||
-rw-r--r-- | comms/lysdr/files/patch-filter.h | 20 | ||||
-rw-r--r-- | comms/lysdr/files/patch-gui.c | 31 | ||||
-rw-r--r-- | comms/lysdr/files/patch-lysdr.c | 13 | ||||
-rw-r--r-- | comms/lysdr/files/patch-sdr.c | 39 | ||||
-rw-r--r-- | comms/lysdr/files/patch-sdr.h | 34 | ||||
-rw-r--r-- | comms/lysdr/files/patch-smeter.c | 10 | ||||
-rw-r--r-- | comms/lysdr/files/patch-smeter.h | 10 | ||||
-rw-r--r-- | comms/lysdr/files/patch-waterfall.c | 109 | ||||
-rw-r--r-- | comms/lysdr/files/patch-waterfall.h | 30 | ||||
-rw-r--r-- | comms/lysdr/pkg-descr | 3 |
17 files changed, 472 insertions, 0 deletions
diff --git a/comms/Makefile b/comms/Makefile index 666144028ae0..bb0913073df0 100644 --- a/comms/Makefile +++ b/comms/Makefile @@ -87,6 +87,7 @@ SUBDIR += lirc SUBDIR += locator SUBDIR += lrzsz + SUBDIR += lysdr SUBDIR += mgetty+sendfax SUBDIR += minicom SUBDIR += mlan3 diff --git a/comms/lysdr/Makefile b/comms/lysdr/Makefile new file mode 100644 index 000000000000..c6188ccac0b3 --- /dev/null +++ b/comms/lysdr/Makefile @@ -0,0 +1,33 @@ +# $FreeBSD$ + +PORTNAME= lysdr +PORTVERSION= 0.0.6 +CATEGORIES= comms hamradio +MASTER_SITES= GH + +MAINTAINER= shurd@sasktel.net +COMMENT= Lysdr SDR program for Unix + +LICENSE= GPLv2 + +LIB_DEPENDS= libfftw3.so:${PORTSDIR}/math/fftw3 \ + libjack.so:${PORTSDIR}/audio/jack + +WRKSRC= ${WRKDIR}/gordonjcp-lysdr-46d31fe +USE_GITHUB= yes +GH_ACCOUNT= gordonjcp +GH_COMMIT= 46d31fe +GH_TAGNAME= stable-0 + +USES= pkgconfig +USE_GNOME= gtk20 +PLIST_FILES= bin/lysdr + +post-patch: + ${CP} ${FILESDIR}/Makefile ${WRKSRC} + ${CP} ${FILESDIR}/cexp.c ${WRKSRC} + +do-install: + @${INSTALL_PROGRAM} ${WRKSRC}/lysdr ${STAGEDIR}${PREFIX}/bin/lysdr + +.include <bsd.port.mk> diff --git a/comms/lysdr/distinfo b/comms/lysdr/distinfo new file mode 100644 index 000000000000..39f2ec0130d2 --- /dev/null +++ b/comms/lysdr/distinfo @@ -0,0 +1,2 @@ +SHA256 (lysdr-0.0.6.tar.gz) = 747b04f0306a3258a02a41a208373a9f0e4c7a59c0c6215ac037c3b76d4e5969 +SIZE (lysdr-0.0.6.tar.gz) = 109559 diff --git a/comms/lysdr/files/Makefile b/comms/lysdr/files/Makefile new file mode 100644 index 000000000000..6903040952f2 --- /dev/null +++ b/comms/lysdr/files/Makefile @@ -0,0 +1,15 @@ +# Makefile based on wscript +# waf does deep magic ignoring our environment. + +PACKAGES= gtk+-2.0 jack fftw3 +CFLAGS+= `pkg-config -cflags ${PACKAGES}` +LDFLAGS+= `pkg-config -libs ${PACKAGES}` -lm + +SRCS= gui.c sdr.c filter.c audio_jack.c smeter.c waterfall.c lysdr.c +.if ${OSVERSION} < 900000 +SRCS+= cexp.c +.endif +PROG= lysdr +WITHOUT_MAN= yes + +.include <bsd.prog.mk> diff --git a/comms/lysdr/files/cexp.c b/comms/lysdr/files/cexp.c new file mode 100644 index 000000000000..595e913be5d8 --- /dev/null +++ b/comms/lysdr/files/cexp.c @@ -0,0 +1,46 @@ +/* $NetBSD: cexp.c,v 1.1 2007/08/20 16:01:34 drochner Exp $ */ + +/*- + * Copyright (c) 2007 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software written by Stephen L. Moshier. + * It is redistributed by the NetBSD Foundation by permission of the author. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <complex.h> +#include <math.h> + +double complex +cexp(double complex z) +{ + double complex w; + double r, x, y; + + x = creal(z); + y = cimag(z); + r = exp(x); + w = r * cos(y) + r * sin(y) * I; + return w; +} diff --git a/comms/lysdr/files/patch-audio_jack.c b/comms/lysdr/files/patch-audio_jack.c new file mode 100644 index 000000000000..4f5a20ad2f32 --- /dev/null +++ b/comms/lysdr/files/patch-audio_jack.c @@ -0,0 +1,29 @@ +--- audio_jack.c.orig 2011-11-26 16:01:22.000000000 -0800 ++++ audio_jack.c 2014-06-02 02:37:35.000000000 -0700 +@@ -93,8 +93,9 @@ + // save some info in the SDR + sdr->size = jack_get_buffer_size(client); + sdr->sample_rate = jack_get_sample_rate(client); +- sdr->iqSample = g_new0(complex, sdr->size); ++ sdr->iqSample = g_new0(complex double, sdr->size); + sdr->output = g_new0(double, sdr->size); ++ return 0; + } + + int audio_stop(sdr_data_t *sdr) { +@@ -104,6 +105,7 @@ + if (sdr->iqSample) g_free(sdr->iqSample); + if (sdr->output) g_free(sdr->output); + ++ return 0; + } + + int audio_connect(sdr_data_t *sdr, gboolean ci, gboolean co) { +@@ -163,6 +165,7 @@ + } + free(ports); + } ++ return 0; + } + + /* vim: set noexpandtab ai ts=4 sw=4 tw=4: */ diff --git a/comms/lysdr/files/patch-filter.c b/comms/lysdr/files/patch-filter.c new file mode 100644 index 000000000000..a3436ef2c1cd --- /dev/null +++ b/comms/lysdr/files/patch-filter.c @@ -0,0 +1,47 @@ +--- filter.c.orig 2011-11-26 16:01:22.000000000 -0800 ++++ filter.c 2014-06-02 03:50:20.000000000 -0700 +@@ -22,16 +22,19 @@ + #include <stdlib.h> + #include <complex.h> + #include <math.h> ++ ++double complex cexp(double complex z); ++ + #include "filter.h" + #include "sdr.h" + + #define IS_ALMOST_DENORMAL(f) (fabs(f) < 3.e-34) + +-static void make_impulse(complex fir_imp[], float sample_rate, int taps, float bw, float centre) { ++static void make_impulse(complex double fir_imp[], float sample_rate, int taps, float bw, float centre) { + + float K = bw * taps / sample_rate; + float w; +- complex z; ++ complex double z; + int k, i=0; + + float tune = 2.0 * M_PI * centre / sample_rate; +@@ -57,7 +60,7 @@ + filter_fir_t *filter = malloc(sizeof(filter_fir_t)); + filter->taps = taps; + filter->size = size; +- filter->impulse = malloc(sizeof(complex)*taps); ++ filter->impulse = malloc(sizeof(complex double)*taps); + filter->imp_I = malloc(sizeof(double)*taps); + filter->imp_Q = malloc(sizeof(double)*taps); + filter->buf_I = malloc(sizeof(double)*taps); +@@ -89,11 +92,11 @@ + } + } + +-void filter_fir_process(filter_fir_t *filter, complex *samples) { ++void filter_fir_process(filter_fir_t *filter, complex double *samples) { + // Perform an FIR filter on the data "in place" + // this routine is slow and has a horrible hack to avoid denormals + int i, j, k; +- complex c; ++ complex double c; + double accI, accQ; + double *buf_I = filter->buf_I; + double *buf_Q = filter->buf_Q; diff --git a/comms/lysdr/files/patch-filter.h b/comms/lysdr/files/patch-filter.h new file mode 100644 index 000000000000..92614f03e520 --- /dev/null +++ b/comms/lysdr/files/patch-filter.h @@ -0,0 +1,20 @@ +--- filter.h.orig 2014-06-02 02:18:30.000000000 -0700 ++++ filter.h 2014-06-02 02:18:39.000000000 -0700 +@@ -30,7 +30,7 @@ + + // FIR filter defs + typedef struct { +- complex *impulse; ++ complex double *impulse; + double *buf_I; + double *buf_Q; + double *imp_I; +@@ -43,7 +43,7 @@ + filter_fir_t *filter_fir_new(int taps, int size); + void filter_fir_destroy(filter_fir_t *filter); + void filter_fir_set_response(filter_fir_t *filter, int sample_rate, float bw, float centre); +-void filter_fir_process(filter_fir_t *filter, complex *samples); ++void filter_fir_process(filter_fir_t *filter, complex double *samples); + #endif + + /* vim: set noexpandtab ai ts=4 sw=4 tw=4: */ diff --git a/comms/lysdr/files/patch-gui.c b/comms/lysdr/files/patch-gui.c new file mode 100644 index 000000000000..ec7e8c563602 --- /dev/null +++ b/comms/lysdr/files/patch-gui.c @@ -0,0 +1,31 @@ +--- gui.c.orig 2011-11-26 16:01:22.000000000 -0800 ++++ gui.c 2014-06-02 03:45:03.000000000 -0700 +@@ -23,6 +23,8 @@ + #include <complex.h> + #include <gtk/gtk.h> + ++double complex cexp(double complex z); ++ + #include "sdr.h" + #include "waterfall.h" + #include "smeter.h" +@@ -31,7 +33,7 @@ + + // these are global so that the gui_update routine can fiddle with them + static GtkWidget *label; +-static GtkWidget *wfdisplay; ++static SDRWaterfall *wfdisplay; + static GtkWidget *meter; + + /* +@@ -215,8 +217,8 @@ + // 20m = 14075000 + // 15m = 21045000 + SDR_WATERFALL(wfdisplay)->centre_freq = sdr->centre_freq; +- gtk_widget_set_size_request(wfdisplay, FFT_SIZE, 250); +- gtk_box_pack_start(GTK_BOX(vbox), wfdisplay, TRUE, TRUE, 0); ++ gtk_widget_set_size_request(GTK_WIDGET(wfdisplay), FFT_SIZE, 250); ++ gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(wfdisplay), TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); + + gtk_widget_show_all(mainWindow); diff --git a/comms/lysdr/files/patch-lysdr.c b/comms/lysdr/files/patch-lysdr.c new file mode 100644 index 000000000000..f307608ebbcb --- /dev/null +++ b/comms/lysdr/files/patch-lysdr.c @@ -0,0 +1,13 @@ +--- lysdr.c.orig 2014-06-02 01:02:06.000000000 -0700 ++++ lysdr.c 2014-06-02 01:02:18.000000000 -0700 +@@ -103,10 +103,6 @@ + + printf("lysdr starting\n"); + +- // get the Gtk threads support going +- if(!g_thread_supported()) +- g_thread_init(NULL); +- + gdk_threads_init(); + gdk_threads_enter(); + diff --git a/comms/lysdr/files/patch-sdr.c b/comms/lysdr/files/patch-sdr.c new file mode 100644 index 000000000000..2d132ca05de9 --- /dev/null +++ b/comms/lysdr/files/patch-sdr.c @@ -0,0 +1,39 @@ +--- sdr.c.orig 2011-11-26 16:01:22.000000000 -0800 ++++ sdr.c 2014-06-02 03:45:08.000000000 -0700 +@@ -26,6 +26,8 @@ + #include <fftw3.h> + #include <string.h> + ++double complex cexp(double complex z); ++ + #include "filter.h" + #include "sdr.h" + +@@ -56,7 +58,7 @@ + // actually do the SDR bit + int i, j, k; + double y, accI, accQ; +- complex c; ++ complex double c; + fft_data_t *fft = sdr->fft; + int size = sdr->size; + int block_size = MIN(size, FFT_SIZE); // ensure we don't try to copy a block larger than FFT_SIZE +@@ -73,8 +75,8 @@ + + // copy this period to FFT buffer, or as much as will fit + // note that if the jack periodsize is greater than FFT_LEN, it will only copy FFT_LEN samples +- memmove(fft->samples, fft->samples+block_size, sizeof(complex)*(FFT_SIZE-block_size)); // move the last lot up +- memmove(fft->samples+FFT_SIZE-block_size, sdr->iqSample, sizeof(complex)*block_size); // copy the current block ++ memmove(fft->samples, fft->samples+block_size, sizeof(complex double)*(FFT_SIZE-block_size)); // move the last lot up ++ memmove(fft->samples+FFT_SIZE-block_size, sdr->iqSample, sizeof(complex double)*block_size); // copy the current block + + + // shift frequency +@@ -123,6 +125,7 @@ + } + break; + } ++ return 0; + } + + void fft_setup(sdr_data_t *sdr) { diff --git a/comms/lysdr/files/patch-sdr.h b/comms/lysdr/files/patch-sdr.h new file mode 100644 index 000000000000..b44725869ab7 --- /dev/null +++ b/comms/lysdr/files/patch-sdr.h @@ -0,0 +1,34 @@ +--- sdr.h.orig 2011-11-26 16:01:22.000000000 -0800 ++++ sdr.h 2014-06-02 02:33:44.000000000 -0700 +@@ -46,9 +46,9 @@ + } fft_data_t; + + typedef struct { +- complex *iqSample; // the array of incoming samples +- complex loVector; // local oscillator vector +- complex loPhase; // local oscillator phase angle (sets tuning) ++ complex double *iqSample; // the array of incoming samples ++ complex double loVector; // local oscillator vector ++ complex double loPhase; // local oscillator phase angle (sets tuning) + gdouble *output; // pointer to output samples + + GtkObject *tuning; // adjustment for tuning +@@ -63,7 +63,7 @@ + filter_fir_t *filter; + + // things to keep track of between callbacks +- complex dc_remove; ++ complex double dc_remove; + gfloat agc_gain; + gfloat agc_speed; + // jack parameters +@@ -74,6 +74,9 @@ + + sdr_data_t *sdr_new(); + int sdr_process(sdr_data_t *sdr); ++void sdr_destroy(sdr_data_t *sdr); ++void fft_setup(sdr_data_t *sdr); ++void fft_teardown(sdr_data_t *sdr); + #endif + + /* vim: set noexpandtab ai ts=4 sw=4 tw=4: */ diff --git a/comms/lysdr/files/patch-smeter.c b/comms/lysdr/files/patch-smeter.c new file mode 100644 index 000000000000..dc6730aa35d9 --- /dev/null +++ b/comms/lysdr/files/patch-smeter.c @@ -0,0 +1,10 @@ +--- smeter.c.orig 2014-06-02 02:39:40.000000000 -0700 ++++ smeter.c 2014-06-02 02:40:19.000000000 -0700 +@@ -85,6 +85,7 @@ + cairo_fill(cr); + + cairo_destroy(cr); ++ return TRUE; + } + + void sdr_smeter_set_level(SDRSMeter *sm, gdouble level) { diff --git a/comms/lysdr/files/patch-smeter.h b/comms/lysdr/files/patch-smeter.h new file mode 100644 index 000000000000..196fc064613b --- /dev/null +++ b/comms/lysdr/files/patch-smeter.h @@ -0,0 +1,10 @@ +--- smeter.h.orig 2014-06-02 02:51:37.000000000 -0700 ++++ smeter.h 2014-06-02 02:51:54.000000000 -0700 +@@ -55,6 +55,7 @@ + + GtkWidget *sdr_smeter_new(); + void sdr_smeter_set_level(SDRSMeter *sm, gdouble value); ++GType sdr_smeter_get_type(void); + + #endif /* __SMETER_H */ + diff --git a/comms/lysdr/files/patch-waterfall.c b/comms/lysdr/files/patch-waterfall.c new file mode 100644 index 000000000000..287d39953742 --- /dev/null +++ b/comms/lysdr/files/patch-waterfall.c @@ -0,0 +1,109 @@ +--- waterfall.c.orig 2011-11-26 16:01:22.000000000 -0800 ++++ waterfall.c 2014-06-02 03:12:20.000000000 -0700 +@@ -21,6 +21,7 @@ + */ + + #include <math.h> ++#include <stdlib.h> + #include <string.h> + + #include <gtk/gtk.h> +@@ -38,8 +39,6 @@ + static void sdr_waterfall_realize(GtkWidget *widget); + static void sdr_waterfall_unrealize(GtkWidget *widget); + static void sdr_waterfall_draw_scale(GtkWidget *widget); +-void sdr_waterfall_set_lowpass(SDRWaterfall *wf, gdouble value); +-void sdr_waterfall_set_highpass(SDRWaterfall *wf, gdouble value); + + static void sdr_waterfall_class_init (SDRWaterfallClass *class) { + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); +@@ -132,8 +131,7 @@ + + sdr_waterfall_set_scale(widget, wf->centre_freq); + +- g_assert(priv->mutex == NULL); +- priv->mutex = g_mutex_new(); ++ g_mutex_init(&priv->mutex); + gtk_adjustment_value_changed(wf->tuning); + } + +@@ -146,7 +144,7 @@ + if (wf->scale) // we might not have a scale + g_object_unref(wf->scale); + +- g_mutex_free(priv->mutex); ++ g_mutex_clear(&priv->mutex); + GTK_WIDGET_CLASS(parent_class)->unrealize(widget); + } + +@@ -184,7 +182,7 @@ + gtk_widget_queue_draw(GTK_WIDGET(wf)); + } + +-GtkWidget *sdr_waterfall_new(GtkAdjustment *tuning, GtkAdjustment *lp_tune, GtkAdjustment *hp_tune, gint sample_rate, gint fft_size) { ++SDRWaterfall *sdr_waterfall_new(GtkAdjustment *tuning, GtkAdjustment *lp_tune, GtkAdjustment *hp_tune, gint sample_rate, gint fft_size) { + // call this with three Adjustments, for tuning, lowpass filter and highpass filter + // the tuning Adjustment should have its upper and lower bounds set to half the sample rate + SDRWaterfall *wf; +@@ -209,7 +207,7 @@ + G_CALLBACK (sdr_waterfall_lowpass_changed), wf); + g_signal_connect (hp_tune, "value-changed", + G_CALLBACK (sdr_waterfall_highpass_changed), wf); +- return GTK_WIDGET(wf); ++ return wf; + + } + +@@ -328,6 +326,7 @@ + gtk_widget_queue_draw(widget); + priv->prelight = prelight; + } ++ return TRUE; + } + + static gboolean sdr_waterfall_button_press(GtkWidget *widget, GdkEventButton *event) { +@@ -358,6 +357,7 @@ + gtk_widget_queue_draw(widget); + break; + } ++ return TRUE; + } + + static gboolean sdr_waterfall_button_release(GtkWidget *widget, GdkEventButton *event) { +@@ -392,6 +392,8 @@ + case GDK_SCROLL_DOWN: + tuning += step; + break; ++ default: ++ break; + } + + sdr_waterfall_set_tuning(wf, tuning); +@@ -418,12 +420,12 @@ + cairo_rectangle(cr, 0, 0, width, height); + cairo_clip(cr); + +- g_mutex_lock(priv->mutex); ++ g_mutex_lock(&priv->mutex); + gdk_cairo_set_source_pixmap(cr, wf->pixmap, 0, -priv->scroll_pos); + cairo_paint(cr); + gdk_cairo_set_source_pixmap(cr, wf->pixmap, 0, height-priv->scroll_pos); + cairo_paint(cr); +- g_mutex_unlock(priv->mutex); ++ g_mutex_unlock(&priv->mutex); + + // cursor is translucent when "off", opaque when prelit + cursor = priv->cursor_pos; +@@ -486,10 +488,10 @@ + (4*wf->fft_size) + ); + +- g_mutex_lock(priv->mutex); ++ g_mutex_lock(&priv->mutex); + cairo_set_source_surface (cr, s_row, 0, priv->scroll_pos); + cairo_paint(cr); +- g_mutex_unlock(priv->mutex); ++ g_mutex_unlock(&priv->mutex); + + priv->scroll_pos++; + if (priv->scroll_pos >= wf->wf_height) priv->scroll_pos = 0; diff --git a/comms/lysdr/files/patch-waterfall.h b/comms/lysdr/files/patch-waterfall.h new file mode 100644 index 000000000000..5d338b3944fe --- /dev/null +++ b/comms/lysdr/files/patch-waterfall.h @@ -0,0 +1,30 @@ +--- waterfall.h.orig 2011-11-26 16:01:22.000000000 -0800 ++++ waterfall.h 2014-06-02 03:08:41.000000000 -0700 +@@ -74,7 +74,7 @@ + gint drag; + gint click_pos; + gdouble bandspread; +- GMutex *mutex; ++ GMutex mutex; + }; + + #define SDR_TYPE_WATERFALL (sdr_waterfall_get_type ()) +@@ -93,7 +93,7 @@ + #define SCALE_HEIGHT 24 + #define SCALE_TICK 5000 + +-GtkWidget *sdr_waterfall_new(GtkAdjustment *tuning, GtkAdjustment *lp_tune, GtkAdjustment *hp_tune, gint sample_rate, gint fft_size); ++SDRWaterfall *sdr_waterfall_new(GtkAdjustment *tuning, GtkAdjustment *lp_tune, GtkAdjustment *hp_tune, gint sample_rate, gint fft_size); + float sdr_waterfall_get_tuning(SDRWaterfall *wf); + float sdr_waterfall_get_lowpass(SDRWaterfall *wf); + float sdr_waterfall_get_highpass(SDRWaterfall *wf); +@@ -102,6 +102,9 @@ + void sdr_waterfall_update(GtkWidget *widget, guchar *row); + void sdr_waterfall_set_scale(GtkWidget *widget, gint centre_freq); + void sdr_waterfall_filter_cursors(SDRWaterfall *wf); ++void sdr_waterfall_set_lowpass(SDRWaterfall *wf, gdouble value); ++void sdr_waterfall_set_highpass(SDRWaterfall *wf, gdouble value); ++GType sdr_waterfall_get_type(void); + #endif /* __WATERFALL_H */ + + /* vim: set noexpandtab ai ts=4 sw=4 tw=4: */ diff --git a/comms/lysdr/pkg-descr b/comms/lysdr/pkg-descr new file mode 100644 index 000000000000..c4c0cc98c21e --- /dev/null +++ b/comms/lysdr/pkg-descr @@ -0,0 +1,3 @@ +lysdr, is a simple SDR program for amateur radio. + +WWW: https://github.com/gordonjcp/lysdr |