From: John Melton - G0ORX/N6LYT Date: Mon, 21 Nov 2016 07:21:16 +0000 (+0000) Subject: fixes cw key swap and build without FREEDV X-Git-Url: https://git.rkrishnan.org/components/-?a=commitdiff_plain;h=f2d03d6687900d8a6adc47cf6b99ad8f36e85ad6;p=pihpsdr.git fixes cw key swap and build without FREEDV --- diff --git a/Makefile b/Makefile index 6057f7d..c6d9e3e 100644 --- a/Makefile +++ b/Makefile @@ -58,11 +58,14 @@ ifeq ($(FREEDV_INCLUDE),FREEDV) FREEDV_OPTIONS=-D FREEDV FREEDVLIBS=-lcodec2 FREEDV_SOURCES= \ -freedv.c +freedv.c \ +freedv_menu.c FREEDV_HEADERS= \ -freedv.h +freedv.h \ +freedv_menu.h FREEDV_OBJS= \ -freedv.o +freedv.o \ +freedv_menu.o endif #required for MRAA GPIO @@ -118,7 +121,6 @@ frequency.c \ discovered.c \ filter.c \ main.c \ -menu.c \ new_menu.c \ exit_menu.c \ general_menu.c \ @@ -129,7 +131,7 @@ dsp_menu.c \ pa_menu.c \ cw_menu.c \ oc_menu.c \ -freedv_menu.c \ +xvtr_menu.c \ rit.c \ meter.c \ mode.c \ @@ -162,7 +164,6 @@ bandstack.h \ channel.h \ discovered.h \ filter.h \ -menu.h \ new_menu.h \ exit_menu.h \ general_menu.h \ @@ -173,7 +174,7 @@ dsp_menu.h \ pa_menu.h \ cw_menu.h \ oc_menu.h \ -freedv_menu.h \ +xvtr_menu.h \ rit.h \ meter.h \ mode.h \ @@ -204,7 +205,6 @@ discovered.o \ filter.o \ version.o \ main.o \ -menu.o \ new_menu.o \ exit_menu.o \ general_menu.o \ @@ -215,7 +215,7 @@ dsp_menu.o \ pa_menu.o \ cw_menu.o \ oc_menu.o \ -freedv_menu.o \ +xvtr_menu.o \ rit.o \ meter.o \ mode.o \ diff --git a/band.c b/band.c index 9f7b5fe..4d7d2b4 100644 --- a/band.c +++ b/band.c @@ -31,7 +31,7 @@ #define LINESDR int band=band20; -int xvtr_band=band160; +int xvtr_band=BANDS; /* --------------------------------------------------------------------------*/ /** @@ -244,19 +244,42 @@ BAND_LIMITS bandLimits[NUM_BAND_LIMITS] = { * @brief xvtr */ /* ----------------------------------------------------------------------------*/ -static XVTR_ENTRY xvtr[12]= - {{"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}, - {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}}; + +BANDSTACK_ENTRY bandstack_entries_xvtr_0[] = + {{0LL,modeUSB,filterF6,150,2550,150,2550}}; +BANDSTACK_ENTRY bandstack_entries_xvtr_1[] = + {{0LL,modeUSB,filterF6,150,2550,150,2550}}; +BANDSTACK_ENTRY bandstack_entries_xvtr_2[] = + {{0LL,modeUSB,filterF6,150,2550,150,2550}}; +BANDSTACK_ENTRY bandstack_entries_xvtr_3[] = + {{0LL,modeUSB,filterF6,150,2550,150,2550}}; +BANDSTACK_ENTRY bandstack_entries_xvtr_4[] = + {{0LL,modeUSB,filterF6,150,2550,150,2550}}; +BANDSTACK_ENTRY bandstack_entries_xvtr_5[] = + {{0LL,modeUSB,filterF6,150,2550,150,2550}}; +BANDSTACK_ENTRY bandstack_entries_xvtr_6[] = + {{0LL,modeUSB,filterF6,150,2550,150,2550}}; +BANDSTACK_ENTRY bandstack_entries_xvtr_7[] = + {{0LL,modeUSB,filterF6,150,2550,150,2550}}; + +BANDSTACK bandstack_xvtr_0={1,1,bandstack_entries_xvtr_0}; +BANDSTACK bandstack_xvtr_1={1,1,bandstack_entries_xvtr_1}; +BANDSTACK bandstack_xvtr_2={1,1,bandstack_entries_xvtr_2}; +BANDSTACK bandstack_xvtr_3={1,1,bandstack_entries_xvtr_3}; +BANDSTACK bandstack_xvtr_4={1,1,bandstack_entries_xvtr_4}; +BANDSTACK bandstack_xvtr_5={1,1,bandstack_entries_xvtr_5}; +BANDSTACK bandstack_xvtr_6={1,1,bandstack_entries_xvtr_6}; +BANDSTACK bandstack_xvtr_7={1,1,bandstack_entries_xvtr_7}; + +static XVTR_ENTRY xvtr[XVTRS]= + {{"",&bandstack_xvtr_0,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}, + {"",&bandstack_xvtr_1,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}, + {"",&bandstack_xvtr_2,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}, + {"",&bandstack_xvtr_3,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}, + {"",&bandstack_xvtr_4,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}, + {"",&bandstack_xvtr_5,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}, + {"",&bandstack_xvtr_6,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}, + {"",&bandstack_xvtr_7,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}}; BANDSTACK_ENTRY *bandstack_entry_get_current() { diff --git a/bandstack.h b/bandstack.h index 4506c5f..9e8b30e 100644 --- a/bandstack.h +++ b/bandstack.h @@ -26,6 +26,7 @@ */ struct _BANDSTACK_ENTRY { long long frequencyA; + long long frequencyB; int mode; int filter; int var1Low; diff --git a/cw_menu.c b/cw_menu.c index 57be2e2..d1c90d8 100644 --- a/cw_menu.c +++ b/cw_menu.c @@ -175,6 +175,7 @@ void cw_menu(GtkWidget *parent) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_keys_reversed_b), cw_keys_reversed); gtk_widget_show(cw_keys_reversed_b); gtk_grid_attach(GTK_GRID(grid),cw_keys_reversed_b,0,6,1,1); + g_signal_connect(cw_keys_reversed_b,"toggled",G_CALLBACK(cw_keys_reversed_cb),NULL); GtkWidget *cw_keyer_sidetone_level_label=gtk_label_new("Sidetone Level:"); //gtk_widget_override_font(cw_keyer_sidetone_level_label, pango_font_description_from_string("Arial 18")); diff --git a/main.c b/main.c index e642e20..e585fc7 100644 --- a/main.c +++ b/main.c @@ -563,7 +563,7 @@ fprintf(stderr,"selected radio=%p device=%d\n",radio,radio->device); case NEW_PROTOCOL: splash_status("Initializing new protocol ..."); fprintf(stderr,"new_protocol_init\n"); - new_protocol_init(0,display_width); + new_protocol_init(display_width); break; #ifdef LIMESDR case LIMESDR_PROTOCOL: diff --git a/new_menu.c b/new_menu.c index c308632..d356dd4 100644 --- a/new_menu.c +++ b/new_menu.c @@ -31,7 +31,10 @@ #include "dsp_menu.h" #include "pa_menu.h" #include "oc_menu.h" +#ifdef FREEDV #include "freedv_menu.h" +#endif +#include "xvtr_menu.h" #include "radio.h" static GtkWidget *parent_window=NULL; @@ -113,12 +116,21 @@ static gboolean oc_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) return TRUE; } +#ifdef FREEDV static gboolean freedv_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { gtk_widget_destroy(dialog); dialog=NULL; freedv_menu(parent_window); return TRUE; } +#endif + +static gboolean xvtr_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { + gtk_widget_destroy(dialog); + dialog=NULL; + xvtr_menu(parent_window); + return TRUE; +} static gboolean new_menu_pressed_event_cb (GtkWidget *widget, GdkEventButton *event, @@ -193,9 +205,16 @@ static gboolean new_menu_pressed_event_cb (GtkWidget *widget, g_signal_connect (oc_b, "button-press-event", G_CALLBACK(oc_cb), NULL); gtk_grid_attach(GTK_GRID(grid),oc_b,2,2,1,1); +#ifdef FREEDV GtkWidget *freedv_b=gtk_button_new_with_label("FreeDV"); g_signal_connect (freedv_b, "button-press-event", G_CALLBACK(freedv_cb), NULL); gtk_grid_attach(GTK_GRID(grid),freedv_b,3,2,1,1); +#endif +/* + GtkWidget *xvtr_b=gtk_button_new_with_label("XVTR"); + g_signal_connect (xvtr_b, "button-press-event", G_CALLBACK(xvtr_cb), NULL); + gtk_grid_attach(GTK_GRID(grid),xvtr_b,4,2,1,1); +*/ gtk_container_add(GTK_CONTAINER(content),grid); diff --git a/new_protocol.c b/new_protocol.c index c51cf59..b3968b6 100644 --- a/new_protocol.c +++ b/new_protocol.c @@ -63,7 +63,6 @@ int data_socket; -static int receiver; static int running; sem_t response_sem; @@ -86,8 +85,8 @@ static int audio_addr_length; static struct sockaddr_in iq_addr; static int iq_addr_length; -static struct sockaddr_in data_addr; -static int data_addr_length; +static struct sockaddr_in data_addr[RECEIVERS]; +static int data_addr_length[RECEIVERS]; static pthread_t new_protocol_thread_id; static pthread_t new_protocol_timer_thread_id; @@ -130,10 +129,10 @@ static int send_high_priority=0; static sem_t send_general_sem; static int send_general=0; -static int samples=0; +static int samples[RECEIVERS]; static int outputsamples=BUFFER_SIZE; -static double iqinputbuffer[BUFFER_SIZE*2]; +static double iqinputbuffer[RECEIVERS][BUFFER_SIZE*2]; static double audiooutputbuffer[BUFFER_SIZE*2]; static int leftaudiosample; @@ -158,7 +157,7 @@ static int psk_resample=6; // convert from 48000 to 8000 static void new_protocol_high_priority(int run); static void* new_protocol_thread(void* arg); static void* new_protocol_timer_thread(void* arg); -static void process_iq_data(unsigned char *buffer); +static void process_iq_data(int rx,unsigned char *buffer); static void process_command_response(unsigned char *buffer); static void process_high_priority(unsigned char *buffer); static void process_mic_data(unsigned char *buffer); @@ -217,12 +216,11 @@ void tuner_changed() { void cw_changed() { } -void new_protocol_init(int rx,int pixels) { +void new_protocol_init(int pixels) { int rc; - receiver=rx; spectrumWIDTH=pixels; - fprintf(stderr,"new_protocol_init: %d\n",rx); + fprintf(stderr,"new_protocol_init\n"); if(local_audio) { if(audio_open_output()!=0) { @@ -246,7 +244,7 @@ void new_protocol_init(int rx,int pixels) { rc=pthread_create(&new_protocol_thread_id,NULL,new_protocol_thread,NULL); if(rc != 0) { - fprintf(stderr,"pthread_create failed on new_protocol_thread for receiver %d: rc=%d\n", receiver, rc); + fprintf(stderr,"pthread_create failed on new_protocol_thread: rc=%d\n", rc); exit(-1); } @@ -293,6 +291,7 @@ static void new_protocol_general() { } static void new_protocol_high_priority(int run) { + int r; unsigned char buffer[1444]; BAND *band=band_get_current_band(); @@ -323,10 +322,13 @@ static void new_protocol_high_priority(int run) { long phase=(long)((4294967296.0*(double)rxFrequency)/122880000.0); // rx - buffer[9]=phase>>24; - buffer[10]=phase>>16; - buffer[11]=phase>>8; - buffer[12]=phase; + + for(r=0;r>24; + buffer[10+(r*4)]=phase>>16; + buffer[11+(r*4)]=phase>>8; + buffer[12+(r*4)]=phase; + } // tx (no split yet) long long txFrequency=ddsFrequency; @@ -600,11 +602,15 @@ static void new_protocol_receive_specific() { buffer[4]=2; // 2 ADCs buffer[5]=0; // dither off if(lt2208Dither) { - buffer[5]=0x01<info.network.interface_address,radio->info.network.interface_length)<0) { - fprintf(stderr,"metis: bind socket failed for data_socket: receiver=%d\n",receiver); + fprintf(stderr,"metis: bind socket failed for data_socket\n"); exit(-1); } @@ -711,11 +717,14 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples); iq_addr_length=radio->info.network.address_length; iq_addr.sin_port=htons(TX_IQ_FROM_HOST_PORT); - memcpy(&data_addr,&radio->info.network.address,radio->info.network.address_length); - data_addr_length=radio->info.network.address_length; - data_addr.sin_port=htons(RX_IQ_TO_HOST_PORT+receiver); + + for(i=0;iinfo.network.address,radio->info.network.address_length); + data_addr_length[i]=radio->info.network.address_length; + data_addr[i].sin_port=htons(RX_IQ_TO_HOST_PORT_0+i); + samples[i]=0; + } - samples=0; audioindex=4; // leave space for sequence audiosequence=0L; @@ -726,7 +735,7 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples); while(running) { bytesread=recvfrom(data_socket,buffer,sizeof(buffer),0,(struct sockaddr*)&addr,&length); if(bytesread<0) { - fprintf(stderr,"recvfrom socket failed for new_protocol_thread: receiver=%d", receiver); + fprintf(stderr,"recvfrom socket failed for new_protocol_thread"); exit(1); } @@ -735,8 +744,11 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples); //fprintf(stderr,"received packet length %d from port %d\n",bytesread,sourceport); switch(sourceport) { - case RX_IQ_TO_HOST_PORT: - process_iq_data(buffer); + case RX_IQ_TO_HOST_PORT_0: + process_iq_data(0,buffer); + break; + case RX_IQ_TO_HOST_PORT_1: + process_iq_data(1,buffer); break; case COMMAND_RESPONCE_TO_HOST_PORT: process_command_response(buffer); @@ -774,7 +786,7 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples); close(data_socket); } -static void process_iq_data(unsigned char *buffer) { +static void process_iq_data(int rx,unsigned char *buffer) { long sequence; long long timestamp; int bitspersample; @@ -805,13 +817,13 @@ static void process_iq_data(unsigned char *buffer) { leftsampledouble=(double)leftsample/8388607.0; // for 24 bits rightsampledouble=(double)rightsample/8388607.0; // for 24 bits - iqinputbuffer[samples*2]=leftsampledouble; - iqinputbuffer[(samples*2)+1]=rightsampledouble; + iqinputbuffer[rx][samples[rx]*2]=leftsampledouble; + iqinputbuffer[rx][(samples[rx]*2)+1]=rightsampledouble; - samples++; - if(samples==BUFFER_SIZE) { - full_rx_buffer(); - samples=0; + samples[rx]++; + if(samples[rx]==BUFFER_SIZE) { + full_rx_buffer(rx); + samples[rx]=0; } } //} @@ -1028,33 +1040,35 @@ static void process_rx_buffer() { } } -static void full_rx_buffer() { +static void full_rx_buffer(int rx) { int j; int error; - fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error); -if(error!=0) { -fprintf(stderr,"full_rx_buffer: fexchange0: error=%d\n",error); -} - switch(mode) { +if(rx==0) { + fexchange0(CHANNEL_RX0, iqinputbuffer[rx], audiooutputbuffer, &error); + if(error!=0) { + fprintf(stderr,"full_rx_buffer: fexchange0: error=%d\n",error); + } + switch(mode) { #ifdef PSK - case modePSK: - break; + case modePSK: + break; #endif - default: - Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer); - break; - } + default: + Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer[rx]); + break; + } - switch(mode) { + switch(mode) { #ifdef FREEDV - case modeFREEDV: - process_freedv_rx_buffer(); - break; + case modeFREEDV: + process_freedv_rx_buffer(); + break; #endif - default: - process_rx_buffer(); - break; + default: + process_rx_buffer(); + break; + } } } diff --git a/new_protocol.h b/new_protocol.h index e8df587..2f3e096 100644 --- a/new_protocol.h +++ b/new_protocol.h @@ -34,7 +34,10 @@ #define HIGH_PRIORITY_TO_HOST_PORT 1025 #define MIC_LINE_TO_HOST_PORT 1026 #define WIDE_BAND_TO_HOST_PORT 1027 -#define RX_IQ_TO_HOST_PORT 1035 +#define RX_IQ_TO_HOST_PORT_0 1035 +#define RX_IQ_TO_HOST_PORT_1 1036 +#define RX_IQ_TO_HOST_PORT_2 1037 +#define RX_IQ_TO_HOST_PORT_3 1038 #define BUFFER_SIZE 1024 @@ -64,7 +67,7 @@ extern int send_general; void schedule_high_priority(int source); void schedule_general(); -void new_protocol_init(int rx,int pixels); +void new_protocol_init(int pixels); void new_protocol_stop(); void filter_board_changed(); diff --git a/old_protocol.c b/old_protocol.c index 21d5c79..45f91a2 100644 --- a/old_protocol.c +++ b/old_protocol.c @@ -139,7 +139,7 @@ static int psk_divisor=6; //static float left_input_buffer[BUFFER_SIZE]; //static float right_input_buffer[BUFFER_SIZE]; -static double iqinputbuffer[BUFFER_SIZE*2]; +static double iqinputbuffer[RECEIVERS][BUFFER_SIZE*2]; //static float mic_left_buffer[BUFFER_SIZE]; //static float mic_right_buffer[BUFFER_SIZE]; @@ -367,17 +367,18 @@ static void *receive_thread(void* arg) { static void process_ozy_input_buffer(char *buffer) { int i,j; + int r; int b=0; unsigned char ozy_samples[8*8]; int bytes; int last_ptt; int last_dot; int last_dash; - int left_sample; - int right_sample; + int left_sample[RECEIVERS]; + int right_sample[RECEIVERS]; int mic_sample; - double left_sample_double; - double right_sample_double; + double left_sample_double[RECEIVERS]; + double right_sample_double[RECEIVERS]; double mic_sample_double; double gain=pow(10.0, mic_gain / 20.0); @@ -435,19 +436,32 @@ static void process_ozy_input_buffer(char *buffer) { // extract the 63 samples - for(i=0;i<63;i++) { - - left_sample = (int)((signed char) buffer[b++]) << 16; - left_sample += (int)((unsigned char)buffer[b++]) << 8; - left_sample += (int)((unsigned char)buffer[b++]); - right_sample = (int)((signed char) buffer[b++]) << 16; - right_sample += (int)((unsigned char)buffer[b++]) << 8; - right_sample += (int)((unsigned char)buffer[b++]); + int iq_samples=63; + switch(RECEIVERS) { + case 1: + iq_samples=63; + break; + case 2: + iq_samples=36; + break; + } + for(i=0;ialexTxAntenna) { case 0: // ANT 1 @@ -908,7 +926,7 @@ void ozy_send_buffer() { output_buffer[C4]=txFrequency; break; case 2: // rx frequency - output_buffer[C0]=0x04; + output_buffer[C0]=0x04+(current_rx*2); long long rxFrequency=ddsFrequency+(long long)rit; if(mode==modeCWU) { rxFrequency-=(long long)cw_keyer_sidetone_frequency; @@ -919,6 +937,10 @@ void ozy_send_buffer() { output_buffer[C2]=rxFrequency>>16; output_buffer[C3]=rxFrequency>>8; output_buffer[C4]=rxFrequency; + current_rx++; + if(current_rx==RECEIVERS) { + current_rx=0; + } break; case 3: { diff --git a/pihpsdr b/pihpsdr index 16c0ab8..23dc59a 100755 Binary files a/pihpsdr and b/pihpsdr differ diff --git a/radio.c b/radio.c index 15f750d..985086f 100644 --- a/radio.c +++ b/radio.c @@ -128,7 +128,7 @@ double drive=50; int drive_level=0; int tune_drive_level=0; -int receivers=2; +int receivers=RECEIVERS; int adc[2]={0,1}; int locked=0; diff --git a/radio.h b/radio.h index 86a4558..19ad1d4 100644 --- a/radio.h +++ b/radio.h @@ -51,6 +51,7 @@ extern char property_path[]; #define ALEX 1 #define APOLLO 2 +#define RECEIVERS 2 /* #define PA_DISABLED 0 #define PA_ENABLED 1 diff --git a/release/pihpsdr.tar b/release/pihpsdr.tar index ec7ccaa..901e40a 100644 Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ diff --git a/release/pihpsdr/pihpsdr b/release/pihpsdr/pihpsdr index 16c0ab8..23dc59a 100755 Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ diff --git a/version.c b/version.c index 0538f3b..337aa7b 100644 --- a/version.c +++ b/version.c @@ -20,4 +20,4 @@ char build_date[]=GIT_DATE; char build_version[]=GIT_VERSION; -char version[]="1.0.0"; +char version[]="1.0.1"; diff --git a/xvtr.h b/xvtr.h index 697b1c2..f94ab49 100644 --- a/xvtr.h +++ b/xvtr.h @@ -20,32 +20,27 @@ #ifndef _XVTR_H #define _XVTR_H +#include "bandstack.h" + +#define XVTRS 8 + /* --------------------------------------------------------------------------*/ /** * @brief XVTR definition */ struct _XVTR_ENTRY { - char name[32]; - long long rxFrequency; - long long rxFrequencyMin; - long long rxFrequencyMax; - long long rxFrequencyLO; - long long txFrequency; - long long txFrequencyMin; - long long txFrequencyMax; - long long txFrequencyLO; - int fullDuplex; - int mode; - int filter; - int var1Low; - int var1High; - int var2Low; - int var2High; - int step; + char title[16]; + BANDSTACK *bandstack; + unsigned char OCrx; + unsigned char OCtx; int preamp; int alexRxAntenna; int alexTxAntenna; int alexAttenuation; + double pa_calibration; + long long frequencyMin; + long long frequencyMax; + long long frequencyLO; }; typedef struct _XVTR_ENTRY XVTR_ENTRY;