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