1 /*
2  *  This program is free software; you can redistribute it and/or
3  *  modify it under the terms of the GNU General Public License as
4  *  published by the Free Software Foundation; either version 3 of
5  *  the License, or (at your option) any later version.
6  *
7  *  This program is distributed in the hope that it will be useful,
8  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *  GNU General Public License for more details:
11  *
12  *  http://www.gnu.org/copyleft/gpl.txt
13  */
14 
15 #ifndef COMMON_H
16 #define COMMON_H    1
17 
18 #ifdef HAVE_CONFIG_H
19 #  include <config.h>
20 #endif
21 
22 #include <gtk/gtk.h>
23 #include <string.h>
24 #include <unistd.h>
25 #include <stdlib.h>
26 #include <math.h>
27 #include <semaphore.h>
28 #ifdef HAVE_LIBPERSEUS_SDR
29   #include <perseus-sdr.h>
30 #endif
31 
32 /* Definitions of flags for various actions */
33 #define ADAPT_SPEED      0x000001 /* Enable speed tracking */
34 #define MAN_THRESHOLD    0x000002 /* Enable manual detector threshold */
35 #define WORD_WRAP        0x000004 /* Enable word wrapping */
36 #define DISPLAY_SIGNAL   0x000008 /* Display output of signal detector */
37 #define DISPLAY_RATIO    0x000010 /* Display situation of Ratio threshold */
38 #define DISPLAY_LEVEL    0x000020 /* Display situation of Level threshold */
39 #define SCOPE_READY      0x000040 /* Scope data ready to display */
40 #define SCOPE_HOLD       0x000080 /* Hold scope display */
41 #define SELECT_LEVEL     0x000100 /* Select Level or Ratio situation display */
42 #define ENABLE_CAT       0x000200 /* Enable CAT for transceiver */
43 #define CAT_SETUP        0x000400 /* CAT is set up */
44 #define ENABLE_RECEIVE   0x000800 /* Enable reception of Morse code */
45 #define RCCONFIG_OK      0x001000 /* xdemorserc file read ok */
46 #define MARK_TONE        0x002000 /* Input signal is mark tone (key down) */
47 #define SPACE_TONE       0x004000 /* Input signal is space tone (key up)  */
48 #define TCVR_SERIAL_TEST 0x008000 /* Serial port is under test */
49 #ifdef HAVE_LIBPERSEUS_SDR
50 #define PERSEUS_INIT     0x010000 /* Perseus initialized OK */
51 #endif
52 
53 /* Return values */
54 #define ERROR           1    /* Error condition */
55 #define SUCCESS         0    /* No error condition */
56 
57 /* Size of char arrays (strings) for error messages etc */
58 #define MESG_SIZE   128
59 
60 /*-------------------------------------------------------------------*/
61 
62 /* Runtine configuration data */
63 typedef struct
64 {
65   char
66     snd_card[32], /* Sound card name */
67     cap_src[32],  /* Capture source  */
68     cap_vol[32],  /* Capture volume  */
69     open_type;    /* Open PCM flag, for Playback or Capture */
70 
71   int
72     channel,    /* ALSA "channel" for use in mixer setup */
73     use_chnl,   /* Channel in use (frontleft=0, frontright=1 etc) */
74     cap_level,  /* Recording/Capture level */
75     dsp_rate;   /* DSP rate (speed) samples/sec */
76 
77   /* Transceiver serial device */
78   char cat_serial[32];
79 
80   /* Receiver type 1=FT847 2=FT857 3=K2 4=K3 5=PERSEUS 0=NONE */
81   int receiver_type;
82 
83   int
84     receiver_freq, /* Receiver frequency in Hz */
85     tone_freq,     /* Receiver BFO Tone freq */
86     center_line,   /* Waterfall BFO Tone freq marker line */
87     ifft_stride,   /* Stride of ifft over input samples   */
88     speed_wpm,     /* Current Morse speed words/min   */
89     unit_elem,     /* Morse unit element (dot) length */
90     min_unit,      /* Minimum length of unit element  */
91     max_unit,      /* Maximum length of unit element  */
92     max_unit_x2,   /* Maximum length of unit element * 2 */
93     det_squelch,   /* Squelch level of signal detector */
94     det_threshold; /* Current threshold value of mark/space detector */
95 
96   double
97     det_ratio,  /* Ratio of lead/trail edge for mark/space detection */
98     freq_correction; /* Correction factor for crystal freq reference */
99 
100   /* Glade file */
101   char xdemorse_glade[64];
102 
103 } rc_data_t;
104 
105 /* Filter data struct */
106 typedef struct filter_data
107 {
108   double
109     cutoff, /* Cutoff frequency as fraction of sample rate */
110     ripple; /* Passband ripple as a percentage */
111 
112   int
113     npoles, /* Number of poles, _must_ be even */
114     type;   /* Filter type, as below this struct */
115 
116   /* a and b Coefficients of the filter */
117   double *a, *b;
118 
119   /* Saved input and output values */
120   double *x, *y;
121 
122   /* Ring buffer index for above */
123   int ring_idx;
124 
125   /* Input samples buffer and its length */
126   double *samples_buf;
127   int samples_buf_len;
128 
129 } filter_data_t;
130 
131 /* Filter type for above struct */
132 enum
133 {
134   FILTER_LOWPASS = 0,
135   FILTER_HIGHPASS,
136   FILTER_BANDPASS
137 };
138 
139 typedef struct
140 {
141   /* Signal/dsp samples buffer */
142   short *buffer;
143 
144   int
145     buffer_idx,  /* Index to signal samples buffer */
146     buffer_size; /* Buffer size according to stereo/mono mode */
147 
148 } samples_buffer_t;
149 
150 /*-------------------------------------------------------------------*/
151 
152 /* Should have been in math.h */
153 #ifndef M_2PI
154   #define M_2PI     6.28318530717958647692
155 #endif
156 
157 #ifndef M_PI
158   #define M_PI      3.14159265358979323846
159 #endif
160 
161 /*-------------------------------------------------------------------*/
162 
163 /*
164  * Standard gettext macros.
165  */
166 #ifdef ENABLE_NLS
167 #  include <libintl.h>
168 #  undef _
169 #  define _(String) dgettext (PACKAGE, String)
170 #  define Q_(String) g_strip_context ((String), gettext (String))
171 #  ifdef gettext_noop
172 #    define N_(String) gettext_noop (String)
173 #  else
174 #    define N_(String) (String)
175 #  endif
176 #else
177 #  define textdomain(String) (String)
178 #  define gettext(String) (String)
179 #  define dgettext(Domain,Message) (Message)
180 #  define dcgettext(Domain,Message,Type) (Message)
181 #  define bindtextdomain(Domain,Directory) (Domain)
182 #  define _(String) (String)
183 #  define Q_(String) g_strip_context ((String), (String))
184 #  define N_(String) (String)
185 #endif
186 
187 /*-------------------------------------------------------------------*/
188 
189 /* Function prototypes produced by cproto */
190 /* callbacks.c */
191 void Error_Dialog(char *message);
192 void on_main_window_destroy(GObject *object, gpointer user_data);
193 gboolean on_main_window_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data);
194 gboolean on_scope_drawingarea_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data);
195 void on_receiver_combobox_changed(GtkComboBox *combobox, gpointer user_data);
196 void on_frequency_spinbutton_value_changed(GtkSpinButton *spin_button, gpointer user_data);
197 gboolean on_frequency_spinbutton_scroll_event(GtkWidget *widget, GdkEvent *event, gpointer user_data);
198 void on_wpm_spinbutton_value_changed(GtkSpinButton *spin_button, gpointer user_data);
199 void on_squelch_spinbutton_value_changed(GtkSpinButton *spin_button, gpointer user_data);
200 void on_ratio_spinbutton_value_changed(GtkSpinButton *spin_button, gpointer user_data);
201 void on_error_quit_button_clicked(GtkButton *button, gpointer user_data);
202 void on_clear_button_clicked(GtkButton *button, gpointer user_data);
203 gboolean on_waterfall_drawingarea_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data);
204 gboolean on_waterfall_drawingarea_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data);
205 void on_error_ok_button_clicked(GtkButton *button, gpointer user_data);
206 void on_auto_checkbutton_toggled(GtkToggleButton *togglebutton, gpointer user_data);
207 void on_error_dialog_destroy(GObject *object, gpointer user_data);
208 gboolean on_error_dialog_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data);
209 void on_waterfall_drawingarea_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data);
210 void on_receive_togglebutton_toggled(GtkToggleButton *togglebutton, gpointer user_data);
211 void on_ratio_radiobutton_toggled(GtkToggleButton *togglebutton, gpointer user_data);
212 void on_level_radiobutton_toggled(GtkToggleButton *togglebutton, gpointer user_data);
213 void on_stop_radiobutton_toggled(GtkToggleButton *togglebutton, gpointer user_data);
214 void on_signal_radiobutton_toggled(GtkToggleButton *togglebutton, gpointer user_data);
215 /* cat.c */
216 gboolean Write_Rx_Freq(int freq);
217 gboolean Open_Tcvr_Serial(void);
218 void Close_Tcvr_Serial(void);
219 gboolean Tune_Tcvr(double x);
220 /* decode.c */
221 gboolean Get_Character(char *chr);
222 /* detect.c */
223 gboolean Get_Fragment(void);
224 void Display_Scope(cairo_t *cr);
225 gboolean Initialize_Detector(void);
226 /* display.c */
227 void Display_Detector(cairo_t *cr, GdkPoint *points);
228 void Display_Signal(cairo_t *cr, GdkPoint *points);
229 void Display_Waterfall(void);
230 gboolean Print_Character(gpointer data);
231 /* filters.c */
232 void Init_Chebyshev_Filter(filter_data_t *filter_data);
233 void DSP_Filter(filter_data_t *filter_data);
234 /* ifft.c */
235 gboolean Initialize_IFFT(int16_t width);
236 void IFFT_Real(int16_t *data);
237 void IFFT_Data(int16_t sample);
238 /* interface.c */
239 GtkWidget *Builder_Get_Object(GtkBuilder *builder, gchar *name);
240 GtkWidget *create_main_window(GtkBuilder **builder);
241 GtkWidget *create_error_dialog(GtkBuilder **builder);
242 /* main.c */
243 int main(int argc, char *argv[]);
244 void Usage(void);
245 /* perseus.c */
246 #ifdef HAVE_LIBPERSEUS_SDR
247 gboolean Demodulate_CW(short *signal_sample);
248 void Perseus_Set_Center_Frequency(int center_freq);
249 void Perseus_Close_Device(void);
250 gboolean Perseus_Initialize(void);
251 #endif
252 /* shared.c */
253 /* sound.c */
254 gboolean Setup_Sound_Card(char *mesg, int *error);
255 void Close_PCM_Handle(void);
256 void Close_Mixer_Handle(void);
257 gboolean Signal_Sample(short *sample);
258 gboolean DSP_Write(short *buffer, int buf_len);
259 /* utils.c */
260 int isFlagSet(int flag);
261 int isFlagClear(int flag);
262 void Set_Flag(int flag);
263 void Clear_Flag(int flag);
264 void Toggle_Flag(int flag);
265 void Cleanup(void);
266 gboolean mem_alloc(void **ptr, size_t req);
267 gboolean mem_realloc(void **ptr, size_t req);
268 void free_ptr(void **ptr);
269 void Strlcpy(char *dest, const char *src, size_t n);
270 void Strlcat(char *dest, const char *src, size_t n);
271 gboolean Load_Config(gpointer data);
272 void Waterfall_Configure_Event(int width, int height);
273 int fix_fft( short reX[], short imX[], short fft_order, short inverse );
274 int fix_fftr( short realX[], int16_t fft_order, int16_t inverse );
275 
276 #endif
277 
278