From 54ac5a3d36b5fd68339a7f4753d862fd21af9389 Mon Sep 17 00:00:00 2001 From: FreeArtMan Date: Fri, 9 Oct 2015 21:32:37 +0100 Subject: Added dongle manager --- hw/sdr.c | 298 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- hw/sdr.h | 66 +++++++++++--- 2 files changed, 349 insertions(+), 15 deletions(-) (limited to 'hw') diff --git a/hw/sdr.c b/hw/sdr.c index 05084b2..13f28c2 100644 --- a/hw/sdr.c +++ b/hw/sdr.c @@ -1 +1,297 @@ -#include "sdr.h" \ No newline at end of file +#include "sdr.h" + +sdr_t* sdr_init() +{ + sdr_t *sdr=NULL; + + sdr = malloc( sizeof(sdr_t) ); + if (sdr == NULL) + return NULL; + + memset( sdr, 0, sizeof(sdr_t) ); + + return sdr; +} + + +//index of device in oter list +//return inner device list +int sdr_open_device( sdr_t *sdr, int dev_index ) +{ + int ret; + dongle_t *dng=NULL; + rtlsdr_dev_t *rtl=NULL; + + //for now only one device will be supported + if (sdr == NULL) + return -1; + + if (sdr->dongle != NULL) + return -1; + + dng = malloc(sizeof(dongle_t)); + memset(dng, 0, sizeof(dongle_t)); + //set default values for dongle_t + DEF_DONGLE_VALUES(dng); + + ret = hw_open( &rtl, (uint32_t)dev_index ); + if ( ret < 0 ) + { + printf("Cannot open device %02d\n", dev_index ); + goto exit_dng_err; + } + + ret = hw_reset_buffer( rtl ); + if ( ret < 0 ) + { + printf("Couldnt reset buffer\n"); + goto exit_dng_err; + } + + ret = hw_set_sample_rate( rtl, dng->rate ); + if ( ret < 0 ) + { + printf("Couldnt set sample rate to %d\n", dng->rate); + goto exit_dng_err; + } + + ret = hw_set_center_freq( rtl, dng->freq ); + if ( ret < 0 ) + { + printf("Couldnt set frequency %d\n", dng->freq ); + goto exit_dng_err; + } + + ret = hw_set_tuner_gain_mode( rtl, dng->gain ); + if ( ret < 0 ) + { + printf("Cannot set autogain mode\n"); + goto exit_dng_err; + } + + ret = hw_set_agc_mode( rtl, 1 ); + if ( ret < 0 ) + { + printf("Cannot set agc mode\n"); + goto exit_dng_err; + } + + dng->dev_index = dev_index; + dng->dev = rtl; + sdr->dongle = dng; + + return 0; + +exit_dng_err: + free( dng ); + + return -1; +} + + +//associate audio device that going to be used +//int sdr_open_audio( sdr_t *sdr, int dev_index );//?should be just device from list or device name? + + +//get device structure from sdr manager by pluged device num +//dont try to free it muahaha +dongle_t* sdr_get_device_id( sdr_t *sdr, int dev_index) +{ + dongle_t *dng=NULL; + + if ( sdr == NULL ) + return NULL; + + if (sdr->dongle == NULL) + return NULL; + + if (sdr->dongle->dev_index != dev_index) + { + printf("Cannot find device with such device ID\n"); + return NULL; + } + + return sdr->dongle; +} + + + +//get index in list of devices of structure from outer device index +//? do we need? +//int sdr_get_dongle_idx( sdr_t *sdr, int idx ); +//close device by internal list index +int sdr_close_device( sdr_t *sdr, int dev_index ) +{ + if ( sdr == NULL ) + return -1; + + if ( sdr->dongle == NULL ) + { + return -1; + } + + if ( sdr->dongle->dev == NULL ) + return -1; + + if ( sdr->dongle->dev_index != dev_index ) + return -1; + + hw_close( sdr->dongle->dev ); + free( sdr->dongle->dev ); + sdr->dongle->dev = NULL; + + free( sdr->dongle ); + sdr->dongle = NULL; + + return 0; +} + + + +//close sdr +//if there is opened audios then close +//if there is opened devices then close +int sdr_close( sdr_t *sdr ) +{ + if ( sdr != NULL ) + { + if ( sdr->dongle != NULL ) + { + if ( sdr->dongle->dev == NULL ) + { + hw_close( sdr->dongle->dev ); + free( sdr->dongle->dev ); + sdr->dongle->dev = NULL; + } + free( sdr->dongle ); + sdr->dongle = NULL; + } + free(sdr); + sdr = NULL; + return 0; + } + return -1; +} + + + +//stop any action that associated with dongle +//not yet implemented +int dongle_stop( dongle_t *dongle ) +{ + return -1; +} + + +//int dongle_open( sdr_t *); +//set dongle frequency +int dongle_set_freq( dongle_t *dongle, uint32_t freq) +{ + int ret = 0; + if ( dongle == NULL ) + return -1; + + if ( dongle->dev == NULL ) + return -1; + + ret = hw_set_center_freq( dongle->dev, freq ); + if ( ret < 0 ) + { + printf("Cannot set device frequency to %ud\n", freq); + return -1; + } + + return 0; +} + + +//set gain +int dongle_set_gain( dongle_t *dongle, int gain) +{ + + int ret; + + if ( dongle == NULL ) + return -1; + + if ( dongle->dev == NULL ) + return -1; + + ret = hw_set_tuner_gain_mode( dongle->dev, gain ); + if ( ret < 0 ) + { + printf("Cannot set tunner gain level %d\n", gain ); + return -1; + } + + return 0; +} + + +//set dongle sample rate +int dongle_set_sample_rate( dongle_t *dongle, uint32_t rate ) +{ + int ret; + + if ( dongle == NULL ) + { + return -1; + } + + if ( dongle->dev == NULL ) + return -1; + + ret = hw_set_sample_rate( dongle->dev, rate ); + if ( ret < 0 ) + { + printf("Cannot set sample rate %ud\n", rate); + return -1; + } + + return 0; +} + +int dongle_set_agc( dongle_t *dongle, int mode) +{ + int ret; + + if ( dongle == NULL ) + return -1; + + if ( dongle->dev == NULL ) + return -1; + + //need mode check things + ret = hw_set_agc_mode( dongle->dev, mode ); + if ( ret < 0 ) + { + printf("Cannot set agc gain mode\n"); + return -1; + } + + return 0; +} + + +uint32_t dongle_get_freq( dongle_t *dongle ) +{ + return dongle->freq; +} + + +int dongle_get_gain( dongle_t *dongle ) +{ + return dongle->gain; +} + + +uint32_t dongle_get_sample_rate( dongle_t *dongle ) +{ + return dongle->rate; +} + + +int dongle_read_samples( dongle_t *dongle, uint8_t *buf, int len ) +{ + return -1; +} \ No newline at end of file diff --git a/hw/sdr.h b/hw/sdr.h index 81ec57f..5a83e8e 100644 --- a/hw/sdr.h +++ b/hw/sdr.h @@ -1,8 +1,15 @@ #ifndef __RADIOLA_HW_SDR_H #define __RADIOLA_HW_SDR_H +#include + #include "hw.h" + +//list of supported devices RTLSDR is rtlsdr tunners, +//AUDIO is just used audio cards +//NET get or send some info to server/client +//PTT usb connected with audio link radios, trought PTT things typedef enum { DEVICE_NONE=0, @@ -22,6 +29,18 @@ typedef struct dongle_t int gain; } dongle_t; +#define DONGLE_SAMPLE_RATE 2048000 +#define DONGLE_CENTER_FREQ 100000000 +#define DONGLE_GAIN 1 + +//dongle pointer to dongle_t +#define DEF_DONGLE_VALUES(DONGLE)\ +{\ +(DONGLE)->freq=DONGLE_CENTER_FREQ;\ +(DONGLE)->rate=DONGLE_SAMPLE_RATE;\ +(DONGLE)->gain=DONGLE_GAIN;\ +} + typedef struct audio_t { @@ -30,32 +49,51 @@ typedef struct audio_t typedef struct sdr_t { - sdr_device dev_type; - dongle_t *dongle; - uint32_t d_used; - audio_t *audio; - uint32_t a_used; + dongle_t *dongle; //list of rtlsdr devices + uint32_t d_used; //not yes used + audio_t *audio; //audio devices used + uint32_t a_used; //not yet used } sdr_t; +//init structure + +sdr_t* sdr_init(); //index of device in oter list //return inner device list int sdr_open_device( sdr_t *sdr, int dev_index ); +//associate audio device that going to be used +//int sdr_open_audio( sdr_t *sdr, int dev_index );//?should be just device from list or device name? + + +//get device structure from sdr manager +dongle_t* sdr_get_device( sdr_t *sdr, int dev_index); + //get index in list of devices of structure from outer device index //? do we need? //int sdr_get_dongle_idx( sdr_t *sdr, int idx ); //close device by internal list index int sdr_close_device( sdr_t *sdr, int idx ); -int dongle_stop( sdr_t *sdr, int idx ); +//close sdr +//if there is opened audios then close +//if there is opened devices then close +int sdr_close( sdr_t *sdr ); + +//stop any action that associated with dongle +int dongle_stop( dongle_t *dongle ); //int dongle_open( sdr_t *); -int dongle_set_freq( sdr_t *sdr, int idx, uint32_t freq); -int dongle_set_gain( sdr_t *sdr, int idx, int gain); -int dongle_set_sample_rate( sdr_t *sdr, int idx, uint32_t srate ); - -uint32_t dongle_get_freq( sdr_t *sdr, int idx ); -int dongle_get_gain( sdr_t *sdr, int idx); -uint32_t dongle_get_sample_rate( sdr_t *sdr, int idx ); -int dongle_get_samples( sdr_t *sdr, int idx, uint8_t *buf, int len ); +//set dongle frequency +int dongle_set_freq( dongle_t *dongle, uint32_t freq); +//set gain +int dongle_set_gain( dongle_t *dongle, int gain); +int dongle_set_agc( dongle_t *dongle, int mode); +//set dongle sample rate +int dongle_set_sample_rate( dongle_t *dongle, uint32_t rate ); + +uint32_t dongle_get_freq( dongle_t *dongle ); +int dongle_get_gain( dongle_t *dongle ); +uint32_t dongle_get_sample_rate( dongle_t *dongle ); +int dongle_read_samples( dongle_t *dongle, uint8_t *buf, int len ); //int dongle_close(); #endif \ No newline at end of file -- cgit v1.2.3