From: pa3gsb Date: Thu, 10 May 2018 13:28:06 +0000 (+0200) Subject: mods after firmware update X-Git-Url: https://git.rkrishnan.org/uri/%3C?a=commitdiff_plain;h=810507a0f359516d90250ac01c9e490a7c87de62;p=pihpsdr.git mods after firmware update --- diff --git a/radioberry.c b/radioberry.c index 9f8bf69..5a5d867 100644 --- a/radioberry.c +++ b/radioberry.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -53,70 +54,29 @@ #define SPEED_192K 0x02 #define SPEED_384K 0x03 -static int display_width; -static int running; -static int sampleSpeed =0; - -unsigned char tx_iqdata[6]; +#define RECEIVED_SAMPLES 128 static GThread *radioberry_thread_id; static gpointer radioberry_thread(gpointer arg); -static GThread *rx_stream_thread_id; -static gpointer rx_stream_thread(gpointer arg); +static int running; static void setSampleSpeed(int r); -static void handleReceiveStream(int r); - -struct timeval rx1_t0; -struct timeval rx1_t1; -struct timeval rx2_t0; -struct timeval rx2_t1; -struct timeval t10; -struct timeval t11; +static int sampleSpeed[2]; + +unsigned char tx_iqdata[6]; struct timeval t20; struct timeval t21; -float elapsed; void spiWriter(); -void rx1_spiReader(); -void rx2_spiReader(); +void rx1_spiReader(unsigned char iqdata[]); +void rx2_spiReader(unsigned char iqdata[]); int prev_drive_level; - -static int rx1_count =0; -static int rx2_count =0; static int txcount =0; -GMutex buf_rx1_mutex; -GMutex buf_rx2_mutex; GMutex mutex_rxtx; -#define MAX_RX_BUFFER (24000) - -double buffer_rx1[MAX_RX_BUFFER][2]; -int fill_rx1 = 0; -int use_rx1 = 0; -sem_t empty; -sem_t full; - -void put_rx1(unsigned char[]); -void get_rx1(double buffer[]); - -double buffer_rx2[MAX_RX_BUFFER][2]; -int fill_rx2 = 0; -int use_rx2 = 0; -sem_t empty_rx2; -sem_t full_rx2; - -void put_rx2(unsigned char[]); -void get_rx2(double buffer[]); - -#ifdef PSK -static int psk_samples=0; -static int psk_divisor=6; -#endif - static int rx1_spi_handler; static int rx2_spi_handler; @@ -147,14 +107,19 @@ float timedifference_msec(struct timeval t0, struct timeval t1) void radioberry_protocol_init(int rx,int pixels) { int i; - sem_init(&empty, 0, MAX_RX_BUFFER); - sem_init(&full, 0, 0); - sem_init(&empty_rx2, 0, MAX_RX_BUFFER); - sem_init(&full_rx2, 0, 0); - - fprintf(stderr,"radioberry_protocol_init\n"); - display_width=pixels; - fprintf(stderr,"radioberry_protocol: buffer size: =%d\n", buffer_size); + fprintf(stderr,"\n"); + fprintf(stderr, "====================================================================\n"); + fprintf(stderr, "====================================================================\n"); + fprintf(stderr, " Radioberry V2.0 beta 2.\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " PIHPSDR plugin version 10-5-2018 \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " Have fune Johan PA3GSB\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "====================================================================\n"); + fprintf(stderr, "====================================================================\n"); #ifndef GPIO if (gpioInitialise() < 0) { @@ -162,9 +127,8 @@ void radioberry_protocol_init(int rx,int pixels) { exit(-1); } #endif - - gpioSetMode(13, PI_INPUT); //rx1_FIFOEmpty - gpioSetMode(16, PI_INPUT); //rx2_FIFOEmpty + gpioSetMode(13, PI_INPUT); //rx1_x-samples received. + gpioSetMode(16, PI_INPUT); //rx2_x-samples received. gpioSetMode(20, PI_INPUT); gpioSetMode(21, PI_OUTPUT); @@ -199,52 +163,36 @@ void radioberry_protocol_init(int rx,int pixels) { exit( -1 ); } fprintf(stderr, "radioberry_thread: id=%p\n",radioberry_thread_id); - - rx_stream_thread_id = g_thread_new( "rx-streaming", rx_stream_thread, NULL); - if( ! rx_stream_thread_id ) - { - fprintf(stderr,"g_thread_new failed on rx_stream_thread\n"); - exit( -1 ); - } - fprintf(stderr, "rx1-streaming: id=%p\n",rx_stream_thread_id); + } -static gpointer rx_stream_thread(gpointer arg) { +void convertToDouble(unsigned char* value, double buffer[]) { - double _iqdata[2]; + int left_sample; + int right_sample; + double left_sample_double; + double right_sample_double; - fprintf(stderr, "radioberry_protocol: rx_stream_thread\n"); + left_sample = (int)((signed char) value[0]) << 16; + left_sample |= (int)((((unsigned char)value[1]) << 8)&0xFF00); + left_sample |= (int)((unsigned char)value[2]&0xFF); + right_sample = (int)((signed char) value[3]) << 16; + right_sample |= (int)((((unsigned char)value[4]) << 8)&0xFF00); + right_sample |= (int)((unsigned char)value[5]&0xFF); - while(running) { - - get_rx1(_iqdata); - // add the samples to the receiver.. - add_iq_samples(receiver[0], _iqdata[0], _iqdata[1]); - - if (receivers==2) { - get_rx2(_iqdata); - // add the samples to the receiver.. - add_iq_samples(receiver[1], _iqdata[0], _iqdata[1]); - }; - } + 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 - fprintf(stderr, "radioberry_protocol stop: rx_stream_thread\n"); + buffer[0] = left_sample_double; + buffer[1] = right_sample_double; } - - static gpointer radioberry_thread(gpointer arg) { fprintf(stderr, "radioberry_protocol: radioberry_thread\n"); - - gettimeofday(&t20, 0); - gettimeofday(&rx1_t0, 0); - gettimeofday(&rx2_t0, 0); - - gpioSetMode(13, PI_INPUT); - gpioSetMode(16, PI_INPUT); - gpioSetMode(20, PI_INPUT); - gpioSetMode(21, PI_OUTPUT); + unsigned char iqdata[6]; + double _iqdata[2]; + while(running) { if (!isTransmitting()) @@ -253,8 +201,28 @@ static gpointer radioberry_thread(gpointer arg) { gpioWrite(21, 0); - rx1_spiReader(); - rx2_spiReader(); + setSampleSpeed(0); + setSampleSpeed(1); + + if (gpioRead(13) == 1) { + int i=0; + for (i=0; i< RECEIVED_SAMPLES; i++) { + rx1_spiReader(iqdata); + convertToDouble(iqdata, _iqdata); + add_iq_samples(receiver[0], _iqdata[0], _iqdata[1]); + } + } + + if (receivers==2) { + if (gpioRead(16) == 1) { + int i=0; + for (i=0; i< RECEIVED_SAMPLES; i++) { + rx2_spiReader(iqdata); + convertToDouble(iqdata, _iqdata); + add_iq_samples(receiver[1], _iqdata[0], _iqdata[1]); + } + } + } g_mutex_unlock(&mutex_rxtx); } @@ -311,16 +279,16 @@ void setSampleSpeed(int r) { switch(receiver[r]->sample_rate) { case 48000: - sampleSpeed=SPEED_48K; + sampleSpeed[r]=SPEED_48K; break; case 96000: - sampleSpeed=SPEED_96K; + sampleSpeed[r]=SPEED_96K; break; case 192000: - sampleSpeed=SPEED_192K; + sampleSpeed[r]=SPEED_192K; break; case 384000: - sampleSpeed=SPEED_384K; + sampleSpeed[r]=SPEED_384K; break; } } @@ -338,14 +306,8 @@ void radioberry_protocol_stop() { } -void rx1_spiReader() { - unsigned char iqdata[6]; - - // return till rxFIFO buffer is filled with at least one element - while ( gpioRead(13) == 1) {return;}; +void rx1_spiReader(unsigned char iqdata[]) { - setSampleSpeed(0); - long long rxFrequency=vfo[0].frequency-vfo[0].lo; if(vfo[0].rit_enabled) { rxFrequency+=vfo[0].rit; @@ -358,37 +320,17 @@ void rx1_spiReader() { } } - iqdata[0] = (sampleSpeed & 0x03); - iqdata[1] = (((active_receiver->random << 6) & 0x40) | ((active_receiver->dither <<5) & 0x20) | (attenuation & 0x1F)); + iqdata[0] = (sampleSpeed[0] & 0x03); + iqdata[1] = (((active_receiver->random << 6) & 0x40) | ((receiver[0]->dither <<5) & 0x20) | (attenuation & 0x1F)); iqdata[2] = ((rxFrequency >> 24) & 0xFF); iqdata[3] = ((rxFrequency >> 16) & 0xFF); iqdata[4] = ((rxFrequency >> 8) & 0xFF); iqdata[5] = (rxFrequency & 0xFF); spiXfer(rx1_spi_handler, iqdata, iqdata, 6); - - put_rx1(iqdata); - - rx1_count ++; - if (rx1_count == 48000) { - rx1_count = 0; - gettimeofday(&rx1_t1, 0); - elapsed = timedifference_msec(rx1_t0, rx1_t1); - printf("Code rx1 mode spi executed in %f milliseconds.\n", elapsed); - gettimeofday(&rx1_t0, 0); - } } -void rx2_spiReader() { - - unsigned char iqdata[6]; - - if (receivers==1) return; - - // return till rx2FIFO buffer is filled with at least one element - while ( gpioRead(16) == 1) {return;}; - - setSampleSpeed(1); +void rx2_spiReader(unsigned char iqdata[]) { long long rxFrequency=vfo[1].frequency-vfo[1].lo; if(vfo[1].rit_enabled) { @@ -402,26 +344,14 @@ void rx2_spiReader() { } } - iqdata[0] = (sampleSpeed & 0x03); + iqdata[0] = (sampleSpeed[1] & 0x03); iqdata[1] = 0x00; //not used by firmware; the active receiver settings are set via rx1 iqdata[2] = ((rxFrequency >> 24) & 0xFF); iqdata[3] = ((rxFrequency >> 16) & 0xFF); iqdata[4] = ((rxFrequency >> 8) & 0xFF); iqdata[5] = (rxFrequency & 0xFF); - spiXfer(rx2_spi_handler, iqdata, iqdata, 6); - - put_rx2(iqdata); - - rx2_count ++; - if (rx2_count == 48000) { - rx2_count = 0; - gettimeofday(&rx2_t1, 0); - elapsed = timedifference_msec(rx2_t0, rx2_t1); - printf("Code rx2 mode spi executed in %f milliseconds.\n", elapsed); - gettimeofday(&rx2_t0, 0); - } - + spiXfer(rx2_spi_handler, iqdata, iqdata, 6); } void spiWriter() { @@ -456,89 +386,4 @@ void spiWriter() { gettimeofday(&t20, 0); } } - -void put_rx1(unsigned char* value) { - - int left_sample; - int right_sample; - double left_sample_double; - double right_sample_double; - - sem_wait(&empty); - - left_sample = (int)((signed char) value[0]) << 16; - left_sample |= (int)((((unsigned char)value[1]) << 8)&0xFF00); - left_sample |= (int)((unsigned char)value[2]&0xFF); - right_sample = (int)((signed char) value[3]) << 16; - right_sample |= (int)((((unsigned char)value[4]) << 8)&0xFF00); - right_sample |= (int)((unsigned char)value[5]&0xFF); - - 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 - - buffer_rx1[fill_rx1][0] = left_sample_double; - buffer_rx1[fill_rx1][1] = right_sample_double; - - g_mutex_lock(&buf_rx1_mutex); - fill_rx1 = (fill_rx1 + 1) % MAX_RX_BUFFER; - g_mutex_unlock(&buf_rx1_mutex); - - sem_post(&full); -} - -void get_rx1(double buffer[]) { - sem_wait(&full); - - buffer[0] = buffer_rx1[use_rx1][0]; - buffer[1] = buffer_rx1[use_rx1][1]; - - g_mutex_lock(&buf_rx1_mutex); - use_rx1 = (use_rx1 + 1) % MAX_RX_BUFFER; - g_mutex_unlock(&buf_rx1_mutex); - - sem_post(&empty); -} - -void put_rx2(unsigned char* value) { - - int left_sample; - int right_sample; - double left_sample_double; - double right_sample_double; - - sem_wait(&empty_rx2); - - left_sample = (int)((signed char) value[0]) << 16; - left_sample |= (int)((((unsigned char)value[1]) << 8)&0xFF00); - left_sample |= (int)((unsigned char)value[2]&0xFF); - right_sample = (int)((signed char) value[3]) << 16; - right_sample |= (int)((((unsigned char)value[4]) << 8)&0xFF00); - right_sample |= (int)((unsigned char)value[5]&0xFF); - - 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 - - buffer_rx2[fill_rx2][0] = left_sample_double; - buffer_rx2[fill_rx2][1] = right_sample_double; - - g_mutex_lock(&buf_rx2_mutex); - fill_rx2 = (fill_rx2 + 1) % MAX_RX_BUFFER; - g_mutex_unlock(&buf_rx2_mutex); - - sem_post(&full_rx2); -} - -void get_rx2(double buffer[]) { - sem_wait(&full_rx2); - - buffer[0] = buffer_rx2[use_rx2][0]; - buffer[1] = buffer_rx2[use_rx2][1]; - - g_mutex_lock(&buf_rx2_mutex); - use_rx2 = (use_rx2 + 1) % MAX_RX_BUFFER; - g_mutex_unlock(&buf_rx2_mutex); - - sem_post(&empty_rx2); -} - // end of source