#ifdef PSK
#include "psk.h"
#endif
+#include "receiver.h"
+#include "transmitter.h"
+#include "vfo.h"
#include <pigpio.h>
-
-#define PI 3.1415926535897932F
-
#define OUTPUT_BUFFER_SIZE 1024
#define SPEED_48K 0x00
#define SPEED_96K 0x01
#define SPEED_192K 0x02
#define SPEED_384K 0x03
-
-static int output_buffer_size;
-static int buffer_size=BUFFER_SIZE;
-
-static int receiver;
static int display_width;
-
static int running;
-
-static int samples=0;
-static int txsamples=0;
-
-static short tx_sample;
-static int left_tx_sample;
-static int right_tx_sample;
-
-static int left_rx_sample;
-static int right_rx_sample;
-
static int sampleSpeed =0;
-static double iqinputbuffer[BUFFER_SIZE*2];
-static double micinputbuffer[BUFFER_SIZE*2];
-static double audiooutputbuffer[BUFFER_SIZE*2];
-static double micoutputbuffer[BUFFER_SIZE*2];
-
unsigned char iqdata[6];
unsigned char tx_iqdata[6];
return (t1.tv_sec - t0.tv_sec) * 1000.0f + (t1.tv_usec - t0.tv_usec) / 1000.0f;
}
-void radioberry_calc_buffers() {
- switch(sample_rate) {
- case 48000:
- output_buffer_size=OUTPUT_BUFFER_SIZE;
- break;
- case 96000:
- output_buffer_size=OUTPUT_BUFFER_SIZE/2;
- break;
- case 192000:
- output_buffer_size=OUTPUT_BUFFER_SIZE/4;
- break;
- case 384000:
- output_buffer_size=OUTPUT_BUFFER_SIZE/8;
- break;
- default:
- fprintf(stderr,"Invalid sample rate: %d. Defaulting to 48K.\n",sample_rate);
- break;
- }
-}
-
-void radioberry_new_sample_rate(int rate){
- sample_rate=rate;
- radioberry_calc_buffers();
- setSampleSpeed();
- wdsp_new_sample_rate(rate);
-}
-
void radioberry_protocol_init(int rx,int pixels) {
- int i;
-
- fprintf(stderr,"radioberry_protocol_init\n");
-
- sem_init(&mutex, 0, 1); //mutal exlusion
-
- receiver=rx;
- display_width=pixels;
-
- radioberry_calc_buffers();
+ int i;
+ fprintf(stderr,"radioberry_protocol_init\n");
+ sem_init(&mutex, 0, 1); //mutal exlusion
+ display_width=pixels;
fprintf(stderr,"radioberry_protocol: buffer size: =%d\n", buffer_size);
-
+
#ifndef GPIO
if (gpioInitialise() < 0) {
fprintf(stderr,"radioberry_protocol: gpio could not be initialized. \n");
printf("init done \n");
setSampleSpeed();
- local_audio=1;
- if(audio_open_output()!=0) {
- fprintf(stderr,"audio_open_output failed\n");
- local_audio=0;
- }
-
- local_microphone = 1;
- if(audio_open_input()!=0) {
- fprintf(stderr,"audio_open_input failed\n");
- local_microphone=0;
- }
+
+ if(transmitter->local_microphone) {
+ if(audio_open_input()!=0) {
+ fprintf(stderr,"audio_open_input failed\n");
+ transmitter->local_microphone=0;
+ }
+ }
start_radioberry_thread();
}
}
static void *radioberry_thread(void* arg) {
- unsigned char buffer[2048];
fprintf(stderr, "radioberry_protocol: radioberry_thread\n");
- samples = 0;
- txsamples=0;
running=1;
gettimeofday(&t20, 0);
}
}
-int correctSampleValue(int value) {
+void radioberry_protocol_iq_samples(int isample,int qsample) {
- if(value>32767) {
- value=32767;
- } else if(value<-32767) {
- value=-32767;
- }
+ if(radiostate == RADIOSTATE_TX) {
- return value;
+ tx_iqdata[0] = 0;
+ tx_iqdata[1] = drive / 6.4; // convert drive level from 0-255 to 0-39 )
+ if (prev_drive_level != drive) {
+ printf("drive level %d - corrected drive level %d \n", drive_level, tx_iqdata[1]);
+ prev_drive_level = drive;
+ }
+ tx_iqdata[2] = isample>>8;
+ tx_iqdata[3] = isample;
+ tx_iqdata[4] = qsample>>8;
+ tx_iqdata[5] = qsample;
+
+ spiWriter();
+
+ sem_post(&mutex);
+ }
+
}
void *radioberry_protocol_process_local_mic(unsigned char *buffer,int le) {
-int b;
-int leftmicsample;
-double mic_sample_double;
-double leftmicsampledouble;
-double gain=32767.0; // 2^16-1
+ int b;
+ short mic_sample;
+ // always 48000 samples per second
b=0;
int i;
for(i=0;i<1024;i++) {
- leftmicsample = (int)((unsigned char)buffer[b++] & 0xFF);
- leftmicsample |= (int)((signed char) buffer[b++]) << 8;
- //rightmicsample=leftmicsample;
-
- mic_sample_double=(1.0 / 2147483648.0) * (double)(leftmicsample<<16);
-
- micinputbuffer[i*2]=mic_sample_double;
- micinputbuffer[(i*2)+1]=mic_sample_double;
- }
-
- if(vox_enabled && (vox || local_microphone)) {
- update_vox(micinputbuffer,BUFFER_SIZE);
- }
-
- if(radiostate == RADIOSTATE_TX) {
-
- int error;
- fexchange0(CHANNEL_TX, micinputbuffer, micoutputbuffer, &error);
- if(error!=0) {
- fprintf(stderr,"fexchange0 (CHANNEL_TX) returned error: %d\n", error);
+ if(le) {
+ mic_sample = (short)((buffer[b++]&0xFF) | (buffer[b++]<<8));
+ } else {
+ mic_sample = (short)((buffer[b++]<<8) | (buffer[b++]&0xFF));
}
- Spectrum0(1, CHANNEL_TX, 0, 0, micoutputbuffer);
-
- int j;
- for(j=0;j<1024;j++) {
- left_tx_sample=(int)(micoutputbuffer[j*2]*gain);
- left_tx_sample = correctSampleValue(left_tx_sample);
- right_tx_sample=(int)(micoutputbuffer[(j*2)+1]*gain);
- right_tx_sample = correctSampleValue(right_tx_sample);
-
- tx_iqdata[0] = 0;
- tx_iqdata[1] = drive / 6.4; // convert drive level from 0-255 to 0-39 )
- if (prev_drive_level != drive) {
- printf("drive level %d - corrected drive level %d \n", drive_level, tx_iqdata[1]);
- prev_drive_level = drive;
- }
- tx_iqdata[2] = left_tx_sample>>8;
- tx_iqdata[3] = left_tx_sample;
- tx_iqdata[4] = right_tx_sample>>8;
- tx_iqdata[5] = right_tx_sample;
-
- spiWriter();
- }
- sem_post(&mutex);
+ add_mic_sample(transmitter,mic_sample);
}
}
static void handleReceiveStream() {
- int error;
int left_sample;
int right_sample;
- int mic_sample;
- float left_sample_float;
- float right_sample_float;
+ double left_sample_double;
+ double right_sample_double;
+ int r;
left_sample = (int)((signed char) iqdata[0]) << 16;
left_sample += (int)((unsigned char)iqdata[1]) << 8;
right_sample += (int)((unsigned char)iqdata[4]) << 8;
right_sample += (int)((unsigned char)iqdata[5]);
- left_sample_float=(float)left_sample/8388607.0; // 24 bit sample 2^23-1
- right_sample_float=(float)right_sample/8388607.0; // 24 bit sample 2^23-1
- iqinputbuffer[samples*2]=(double)left_sample_float;
- iqinputbuffer[(samples*2)+1]=(double)right_sample_float;
- samples++;
+ 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
- if(samples==buffer_size) {
- // process the input
- fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error);
- if(error!=0) {
- samples=0;
- fprintf(stderr,"fexchange2 (CHANNEL_RX0) returned error: %d\n", error);
- }
-
- if(local_audio) {
- int j;
- for(j=0;j<output_buffer_size;j++) {
- left_rx_sample=(short)(audiooutputbuffer[j*2]*32767.0*volume);
- right_rx_sample=(short)(audiooutputbuffer[(j*2)+1]*32767.0*volume);
-
-#ifdef PSK
- if(mode==modePSK) {
- if(psk_samples==0) {
- psk_demod((double)((left_rx_sample+right_rx_sample)/2));
- }
- psk_samples++;
- if(psk_samples==psk_divisor) {
- psk_samples=0;
- }
- }
-#endif
- audio_write(left_rx_sample,right_rx_sample);
- }
- }
-
- //Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer);
-
-#ifdef PSK
- if(mode!=modePSK) {
-#endif
- Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer);
-#ifdef PSK
- }
-#endif
-
- samples=0;
+ for(r=0;r<RECEIVERS;r++) {
+ add_iq_samples(receiver[r], left_sample_double,right_sample_double);
}
}
void setSampleSpeed() {
- switch(sample_rate) {
+ switch(active_receiver->sample_rate) {
case 48000:
sampleSpeed=SPEED_48K;
break;
gpioTerminate();
#endif
- audio_close_input();
- audio_close_output();
}
void spiReader() {
// wait till rxFIFO buffer is filled with at least one element
while ( gpioRead(13) == 1) {};
- long long rxFrequency=ddsFrequency+(long long)rit;
+ setSampleSpeed();
+
+ int v=receiver[0]->id;
+ long long rxFrequency=vfo[v].frequency-vfo[v].lo;
+ if(vfo[v].rit_enabled) {
+ rxFrequency+=vfo[v].rit;
+ }
+ if(vfo[active_receiver->id].mode==modeCWU) {
+ rxFrequency-=(long long)cw_keyer_sidetone_frequency;
+ } else if(vfo[active_receiver->id].mode==modeCWL) {
+ rxFrequency+=(long long)cw_keyer_sidetone_frequency;
+ }
iqdata[0] = (sampleSpeed & 0x03);
- iqdata[1] = (((rx_random << 6) & 0x40) | ((rx_dither <<5) & 0x20) | (attenuation & 0x1F));
+ iqdata[1] = (((active_receiver->random << 6) & 0x40) | ((active_receiver->dither <<5) & 0x20) | (attenuation & 0x1F));
iqdata[2] = ((rxFrequency >> 24) & 0xFF);
iqdata[3] = ((rxFrequency >> 16) & 0xFF);
iqdata[4] = ((rxFrequency >> 8) & 0xFF);