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
discovered.c \
filter.c \
main.c \
-menu.c \
new_menu.c \
exit_menu.c \
general_menu.c \
pa_menu.c \
cw_menu.c \
oc_menu.c \
-freedv_menu.c \
+xvtr_menu.c \
rit.c \
meter.c \
mode.c \
channel.h \
discovered.h \
filter.h \
-menu.h \
new_menu.h \
exit_menu.h \
general_menu.h \
pa_menu.h \
cw_menu.h \
oc_menu.h \
-freedv_menu.h \
+xvtr_menu.h \
rit.h \
meter.h \
mode.h \
filter.o \
version.o \
main.o \
-menu.o \
new_menu.o \
exit_menu.o \
general_menu.o \
pa_menu.o \
cw_menu.o \
oc_menu.o \
-freedv_menu.o \
+xvtr_menu.o \
rit.o \
meter.o \
mode.o \
#define LINESDR
int band=band20;
-int xvtr_band=band160;
+int xvtr_band=BANDS;
/* --------------------------------------------------------------------------*/
/**
* @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() {
*/
struct _BANDSTACK_ENTRY {
long long frequencyA;
+ long long frequencyB;
int mode;
int filter;
int var1Low;
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"));
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:
#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;
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,
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);
int data_socket;
-static int receiver;
static int running;
sem_t response_sem;
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;
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;
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);
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) {
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);
}
}
static void new_protocol_high_priority(int run) {
+ int r;
unsigned char buffer[1444];
BAND *band=band_get_current_band();
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<receivers;r++) {
+ buffer[9+(r*4)]=phase>>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;
buffer[4]=2; // 2 ADCs
buffer[5]=0; // dither off
if(lt2208Dither) {
- buffer[5]=0x01<<receiver;
+ for(i=0;i<receivers;i++) {
+ buffer[5]|=0x01<<i;
+ }
}
buffer[6]=0; // random off
if(lt2208Random) {
- buffer[6]=0x01<<receiver;
+ for(i=0;i<receivers;i++) {
+ buffer[6]|=0x01<<i;
+ }
}
buffer[7]=0x00;
for(i=0;i<receivers;i++) {
buffer[28]=24;
if(sendto(data_socket,buffer,sizeof(buffer),0,(struct sockaddr*)&receiver_addr,receiver_addr_length)<0) {
- fprintf(stderr,"sendto socket failed for start: receiver=%d\n",receiver);
+ fprintf(stderr,"sendto socket failed for start\n");
exit(1);
}
void* new_protocol_thread(void* arg) {
-
+ int i;
struct sockaddr_in addr;
int length;
unsigned char buffer[2048];
int bytesread;
short sourceport;
-fprintf(stderr,"new_protocol_thread: receiver=%d\n", receiver);
+fprintf(stderr,"new_protocol_thread\n");
micsamples=0;
iqindex=4;
fprintf(stderr,"outputsamples=%d\n", outputsamples);
data_socket=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(data_socket<0) {
- fprintf(stderr,"metis: create socket failed for data_socket: receiver=%d\n",receiver);
+ fprintf(stderr,"metis: create socket failed for data_socket\n");
exit(-1);
}
// bind to the interface
if(bind(data_socket,(struct sockaddr*)&radio->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);
}
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;i<RECEIVERS;i++) {
+ memcpy(&data_addr[i],&radio->info.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;
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);
}
//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);
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;
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;
}
}
//}
}
}
-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;
+ }
}
}
#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
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();
//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];
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);
// 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;i<iq_samples;i++) {
+
+ for(r=0;r<RECEIVERS;r++) {
+ left_sample[r] = (int)((signed char) buffer[b++]) << 16;
+ left_sample[r] += (int)((unsigned char)buffer[b++]) << 8;
+ left_sample[r] += (int)((unsigned char)buffer[b++]);
+ right_sample[r] = (int)((signed char) buffer[b++]) << 16;
+ right_sample[r] += (int)((unsigned char)buffer[b++]) << 8;
+ right_sample[r] += (int)((unsigned char)buffer[b++]);
+ }
mic_sample = (int)((signed char) buffer[b++]) << 8;
mic_sample += (int)((unsigned char)buffer[b++]);
- left_sample_double=(double)left_sample/8388607.0; // 24 bit sample 2^23-1
- right_sample_double=(double)right_sample/8388607.0; // 24 bit sample 2^23-1
+ for(r=0;r<RECEIVERS;r++) {
+ left_sample_double[r]=(double)left_sample[r]/8388607.0; // 24 bit sample 2^23-1
+ right_sample_double[r]=(double)right_sample[r]/8388607.0; // 24 bit sample 2^23-1
+ }
mic_sample_double = (1.0 / 2147483648.0) * (double)(mic_sample<<16);
// add to buffer
mic_sample_double = (1.0 / 2147483648.0) * (double)(mic_sample<<16);
micinputbuffer[samples*2]=mic_sample_double;
micinputbuffer[(samples*2)+1]=mic_sample_double;
- iqinputbuffer[samples*2]=0.0;
- iqinputbuffer[(samples*2)+1]=0.0;
+ iqinputbuffer[0][samples*2]=0.0;
+ iqinputbuffer[0][(samples*2)+1]=0.0;
samples++;
if(samples==buffer_size) {
full_tx_buffer();
micinputbuffer[samples*2]=mic_sample_double*gain;
micinputbuffer[(samples*2)+1]=mic_sample_double*gain;
}
- iqinputbuffer[samples*2]=0.0;
- iqinputbuffer[(samples*2)+1]=0.0;
+ iqinputbuffer[0][samples*2]=0.0;
+ iqinputbuffer[0][(samples*2)+1]=0.0;
samples++;
if(samples==buffer_size) {
full_tx_buffer();
if(!isTransmitting()) {
micinputbuffer[samples*2]=0.0;
micinputbuffer[(samples*2)+1]=0.0;
- iqinputbuffer[samples*2]=left_sample_double;
- iqinputbuffer[(samples*2)+1]=right_sample_double;
+ iqinputbuffer[0][samples*2]=left_sample_double[0];
+ iqinputbuffer[0][(samples*2)+1]=right_sample_double[0];
samples++;
if(samples==buffer_size) {
full_rx_buffer();
int j;
int error;
- fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error);
+ fexchange0(CHANNEL_RX0, iqinputbuffer[0], audiooutputbuffer, &error);
fexchange0(CHANNEL_TX, micinputbuffer, iqoutputbuffer, &error);
#ifdef PSK
if(mode!=modePSK) {
#endif
- Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer);
+ Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer[0]);
#ifdef PSK
}
#endif
leftmicsampledouble=(double)leftmicsample/32767.0; // 16 bit sample 2^16-1
micinputbuffer[samples*2]=leftmicsampledouble;
micinputbuffer[(samples*2)+1]=leftmicsampledouble;
- iqinputbuffer[samples*2]=0.0;
- iqinputbuffer[(samples*2)+1]=0.0;
+ iqinputbuffer[0][samples*2]=0.0;
+ iqinputbuffer[0][(samples*2)+1]=0.0;
samples++;
if(samples==buffer_size) {
full_tx_buffer();
micinputbuffer[samples*2]=leftmicsampledouble;
micinputbuffer[(samples*2)+1]=leftmicsampledouble;
}
- iqinputbuffer[samples*2]=0.0;
- iqinputbuffer[(samples*2)+1]=0.0;
+ iqinputbuffer[0][samples*2]=0.0;
+ iqinputbuffer[0][(samples*2)+1]=0.0;
samples++;
if(samples==buffer_size) {
full_tx_buffer();
*/
+int current_rx=0;
+
void ozy_send_buffer() {
output_buffer[SYNC0]=SYNC;
// TODO - add Alex TX relay, duplex, receivers Mercury board frequency
- output_buffer[C4]=0x04;
+ output_buffer[C4]=0x04; // duplex
+ output_buffer[C4]|=(RECEIVERS-1)<<3;
+
if(isTransmitting()) {
switch(band->alexTxAntenna) {
case 0: // ANT 1
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;
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:
{
int drive_level=0;
int tune_drive_level=0;
-int receivers=2;
+int receivers=RECEIVERS;
int adc[2]={0,1};
int locked=0;
#define ALEX 1
#define APOLLO 2
+#define RECEIVERS 2
/*
#define PA_DISABLED 0
#define PA_ENABLED 1
char build_date[]=GIT_DATE;
char build_version[]=GIT_VERSION;
-char version[]="1.0.0";
+char version[]="1.0.1";
#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;