WinRadio G313: Updates from Julian Campbell

"I've re-written the hamlib backend to stream the audio, if and spectrum
pcm samples to simple file system objects.

If no path is given, streaming is not requested. If the path can't be
openned, no streaming is requested.

The file is openned non-blocking and overruns are just silently
discarded.

I've tested it using named fifos and if there is no active reader it
fails to open and if there is an active reader it streams fine.

Thats as simple as it can get.

In terms of the project files, I've put the wrg313api.c and wrg313api.h
files in the existing linradio subfolder of winradio.

The .h file is the g313 equivalent of the wrapi.h file already there.
The .c file actually just contains the dlopen and the assignments to the
function variables.

The actual API shared library is binary only (and 32-bit only), and not
included in my patch."

Signed-off-by: Nate Bargmann <n0nb@n0nb.us>
Hamlib-3.0
Julian Cable 2012-11-10 02:33:55 -08:00 zatwierdzone przez Nate Bargmann
rodzic f92d2ea0f7
commit 0005b9a511
5 zmienionych plików z 853 dodań i 4 usunięć

Wyświetl plik

@ -1,6 +1,6 @@
WRSRCLIST = wr1000.c wr1500.c wr1550.c wr3100.c wr3150.c wr3500.c wr3700.c \
g303.c g313.c g305.c
g303.c g313.c g305.c linradio/wrg313api.c
pkglib_LTLIBRARIES = hamlib-winradio.la
hamlib_winradio_la_SOURCES = $(WRSRCLIST) winradio.c
@ -9,4 +9,4 @@ hamlib_winradio_la_LIBADD = $(top_builddir)/src/libhamlib.la
EXTRA_DIST = NOTES
noinst_HEADERS = winradio.h linradio/radio_ioctl.h linradio/wrapi.h
noinst_HEADERS = winradio.h linradio/radio_ioctl.h linradio/wrapi.h linradio/wrg313api.h

Wyświetl plik

@ -22,6 +22,10 @@
#include <hamlib/rig.h>
#include "winradio.h"
#define G313_FUNC RIG_FUNC_NONE
#define G313_LEVEL (RIG_LEVEL_ATT | RIG_LEVEL_AGC | RIG_LEVEL_RF | RIG_LEVEL_STRENGTH | RIG_LEVEL_RAWSTR)
#define G313_MODES (RIG_MODE_NONE)
#ifdef _WIN32
@ -638,4 +642,510 @@ int g313_get_conf(RIG *rig, token_t token, char *val)
return RIG_OK;
}
#endif /* _WIN32 */
/* end _WIN32 */
#else
/* linux, maybe other posix */
#include <time.h>
#include "linradio/wrg313api.h"
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define TOK_SHM_AUDIO 0x150901
#define TOK_SHM_IF 0x150902
#define TOK_SHM_SPECTRUM 0x150903
#define FIFO_PATHNAME_SIZE 64
const struct confparams g313_cfg_params[] = {
{ TOK_SHM_AUDIO, "audio_path", "audio path name",
"POSIX shared memory path name to the audio ringbuffer",
"", RIG_CONF_STRING,
},
{ TOK_SHM_IF, "if_path", "I/F path name",
"POSIX shared memory path name to the I/F ringbuffer",
"", RIG_CONF_STRING,
},
{ TOK_SHM_SPECTRUM, "spectrum_path", "spectrum path name",
"POSIX shared memory path name to the spectrum ringbuffer",
"", RIG_CONF_STRING,
},
{ RIG_CONF_END, NULL, }
};
struct g313_fifo_data {
int fd;
char path[FIFO_PATHNAME_SIZE];
};
struct g313_priv_data {
int hRadio;
int Opened;
struct g313_fifo_data if_buf;
struct g313_fifo_data audio_buf;
struct g313_fifo_data spectrum_buf;
};
static void g313_audio_callback(short* buffer, int count, void* arg);
static void g313_if_callback(short* buffer, int count, void* arg);
static void g313_spectrum_callback(float* buffer, int count, void* arg);
int g313_init(RIG *rig)
{
struct g313_priv_data *priv;
priv = (struct g313_priv_data*)malloc(sizeof(struct g313_priv_data));
memset(priv, 0, sizeof(struct g313_priv_data));
if (!priv) {
/* whoops! memory shortage! */
return -RIG_ENOMEM;
}
if(!InitAPI())
{
rig_debug(RIG_DEBUG_ERR, "%s: Unable to initialise G313 api\n", __FUNCTION__);
free(priv);
return -RIG_EIO;
}
rig_debug(RIG_DEBUG_VERBOSE, "%s: Initialised G313 API\n", __FUNCTION__);
rig->state.priv = (void*)priv;
return RIG_OK;
}
int g313_open(RIG *rig)
{
int ret;
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
RADIO_DESC *List;
int Count;
void* audio_callback = g313_audio_callback;
void* if_callback = g313_if_callback;
void* spectrum_callback = g313_spectrum_callback;
if(priv->Opened)
return RIG_OK;
ret = GetDeviceList(&List, &Count);
if(ret<0 || Count==0)
return -RIG_EIO;
/* Open Winradio receiver handle (default to first device?) */
rig_debug(RIG_DEBUG_VERBOSE, "%s: found %d rigs 0 is %s\n", __FUNCTION__, Count, List[0].Path);
if(rig->state.rigport.pathname[0])
priv->hRadio = OpenDevice(rig->state.rigport.pathname);
else
priv->hRadio = OpenDevice(List[0].Path);
DestroyDeviceList(List);
if (priv->hRadio < 0)
{
return -RIG_EIO; /* huh! */
}
rig_debug(RIG_DEBUG_VERBOSE, "%s: Openned G313\n", __FUNCTION__);
/* Make sure the receiver is switched on */
SetPower(priv->hRadio, 1);
priv->audio_buf.fd = open(priv->audio_buf.path, O_WRONLY|O_NONBLOCK);
rig_debug(RIG_DEBUG_VERBOSE, "%s: audio path %s fifo: %d\n", __FUNCTION__, priv->audio_buf.path, priv->audio_buf.fd);
if(priv->audio_buf.fd == -1)
audio_callback = NULL;
priv->if_buf.fd = open(priv->if_buf.path, O_WRONLY|O_NONBLOCK);
rig_debug(RIG_DEBUG_VERBOSE, "%s: if path %s fifo: %d\n", __FUNCTION__, priv->if_buf.path, priv->if_buf.fd);
if(priv->if_buf.fd == -1)
if_callback = NULL;
priv->spectrum_buf.fd = open(priv->spectrum_buf.path, O_WRONLY|O_NONBLOCK);
rig_debug(RIG_DEBUG_VERBOSE, "%s: spectrum path %s fifo: %d\n", __FUNCTION__, priv->spectrum_buf.path, priv->spectrum_buf.fd);
if(priv->spectrum_buf.fd == -1)
spectrum_callback = NULL;
ret = StartStreaming(priv->hRadio, audio_callback, if_callback, spectrum_callback, priv);
if(ret)
{
return -RIG_EIO;
}
rig_debug(RIG_DEBUG_VERBOSE, "%s: told G313 to start streaming audio: %d, if: %d, spec: %d\n",
__FUNCTION__,
audio_callback?1:0, if_callback?1:0, spectrum_callback?1:0);
priv->Opened=1;
return RIG_OK;
}
int g313_close(RIG *rig)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
if(!priv->Opened)
{
return RIG_OK;
}
priv->Opened=0;
/*
rig_debug(RIG_DEBUG_VERBOSE, "%s: stop streaming\n", __FUNCTION__);
StopStreaming(priv->hRadio);
req.tv_sec=0;
req.tv_nsec=500000000L;
nanosleep(&req, NULL);
*/
rig_debug(RIG_DEBUG_VERBOSE, "%s: Closing G313\n", __FUNCTION__);
CloseDevice(priv->hRadio);
return RIG_OK;
}
int g313_cleanup(RIG *rig)
{
struct g313_priv_data *priv;
if (!rig)
return -RIG_EINVAL;
priv=(struct g313_priv_data *)rig->state.priv;
rig_debug(RIG_DEBUG_VERBOSE, "%s: close fifos\n", __FUNCTION__);
if(priv->audio_buf.fd>=0)
close(priv->audio_buf.fd);
if(priv->if_buf.fd>=0)
close(priv->if_buf.fd);
if(priv->spectrum_buf.fd)
close(priv->spectrum_buf.fd);
if (rig->state.priv)
free(rig->state.priv);
rig->state.priv = NULL;
rig_debug(RIG_DEBUG_VERBOSE, "%s: Uninitialising G313 API\n", __FUNCTION__);
UninitAPI();
return RIG_OK;
}
int g313_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
int ret;
rig_debug(RIG_DEBUG_VERBOSE, "%s: %u\n", __FUNCTION__, (unsigned int)freq);
ret = SetFrequency(priv->hRadio, (unsigned int) (freq));
ret = ret==0 ? RIG_OK : -RIG_EIO;
return ret;
}
int g313_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
unsigned int f;
int ret = GetFrequency(priv->hRadio, &f);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d f: %u\n", __FUNCTION__, ret, f);
if(ret)
return -RIG_EIO;
*freq = (freq_t)f;
return RIG_OK;
}
int g313_set_powerstat(RIG *rig, powerstat_t status)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
int p = status==RIG_POWER_ON ? 1 : 0;
int ret = SetPower(priv->hRadio, p);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d state: %d\n", __FUNCTION__, ret, p);
return ret==0 ? RIG_OK : -RIG_EIO;
}
int g313_get_powerstat(RIG *rig, powerstat_t *status)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
int p;
int ret = GetPower(priv->hRadio, &p);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d state: %d\n", __FUNCTION__, ret, p);
if(ret)
return -RIG_EIO;
*status = p ? RIG_POWER_ON : RIG_POWER_OFF;
return RIG_OK;
}
int g313_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
int ret, agc;
switch(level) {
case RIG_LEVEL_ATT:
ret = SetAttenuator(priv->hRadio, val.i != 0 ? 1 : 0);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d Attenuator: %d\n", __FUNCTION__, ret, val.i);
break;
case RIG_LEVEL_AGC:
switch (val.i) {
case RIG_AGC_OFF: agc = 0; break;
case RIG_AGC_SLOW: agc = 1; break;
case RIG_AGC_MEDIUM: agc = 2; break;
case RIG_AGC_FAST: agc = 3; break;
default:
return -RIG_EINVAL;
}
ret = SetAGC(priv->hRadio, agc);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d AGC: %d\n", __FUNCTION__, ret, val.i);
break;
case RIG_LEVEL_RF:
ret = SetIFGain(priv->hRadio, (int)(val.f*100));
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d Gain: %f\n", __FUNCTION__, ret, val.f);
break;
default:
return -RIG_EINVAL;
}
return ret==0 ? RIG_OK : -RIG_EIO;
}
int g313_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
int ret;
int value;
unsigned int uvalue;
double dbl;
unsigned char ch;
switch(level) {
case RIG_LEVEL_ATT:
ret = GetAttenuator(priv->hRadio, &value);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d Attenuator: %u\n", __FUNCTION__, ret, value);
if(ret)
return -RIG_EIO;
val->i = value?rig->caps->attenuator[0]:0;
break;
case RIG_LEVEL_AGC:
ret = GetAGC(priv->hRadio, &value);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d AGC: %u\n", __FUNCTION__, ret, value);
if(ret)
return -RIG_EIO;
switch (value) {
case 0: val->i = RIG_AGC_OFF; break;
case 1: val->i = RIG_AGC_SLOW; break;
case 2: val->i = RIG_AGC_MEDIUM; break;
case 3: val->i = RIG_AGC_FAST; break;
default:
return -RIG_EINVAL;
}
break;
case RIG_LEVEL_RF:
ret = GetIFGain(priv->hRadio, &uvalue);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d Gain: %u\n", __FUNCTION__, ret, uvalue);
if(ret)
return -RIG_EIO;
val->f = ((float)uvalue)/100.0;
break;
case RIG_LEVEL_STRENGTH:
ret = GetSignalStrength(priv->hRadio, &dbl);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d sigstr: %f\n", __FUNCTION__, ret, dbl);
if(ret)
return -RIG_EIO;
val->i = ((int)dbl/1.0)+73;
break;
case RIG_LEVEL_RAWSTR:
ret = GetRawSignalStrength(priv->hRadio, &ch);
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d Raw Sigstr: %u\n", __FUNCTION__, ret, (unsigned int)ch);
if(ret)
return -RIG_EIO;
val->i = ch;
break;
default:
return -RIG_EINVAL;
}
return RIG_OK;
}
static const char* g313_get_info(RIG *rig)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
static RADIO_INFO info;
int ret;
info.Size = sizeof(RADIO_INFO);
ret = GetRadioInfo(priv->hRadio,&info);
if(ret)
return NULL;
rig_debug(RIG_DEBUG_VERBOSE, "%s: ret: %d sernum: %s\n", __FUNCTION__, ret, info.SerNum);
return info.SerNum;
}
int g313_set_conf(RIG *rig, token_t token, const char *val)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
size_t len = strlen(val);
switch(token)
{
case TOK_SHM_AUDIO:
if(len>(FIFO_PATHNAME_SIZE-1))
{
rig_debug(RIG_DEBUG_WARN, "%s: set audio_path %s is too long\n", __FUNCTION__, val);
return -RIG_EINVAL;
}
memset(priv->audio_buf.path, 0, FIFO_PATHNAME_SIZE);
strcpy(priv->audio_buf.path, val);
rig_debug(RIG_DEBUG_VERBOSE, "%s: set audio_path %s\n", __FUNCTION__, priv->audio_buf.path);
break;
case TOK_SHM_IF:
if(len>(FIFO_PATHNAME_SIZE-1))
{
rig_debug(RIG_DEBUG_WARN, "%s: set if_path %s is too long\n", __FUNCTION__, val);
return -RIG_EINVAL;
}
memset(priv->if_buf.path, 0, FIFO_PATHNAME_SIZE);
strcpy(priv->if_buf.path, val);
rig_debug(RIG_DEBUG_VERBOSE, "%s: set if_path %s\n", __FUNCTION__, priv->if_buf.path);
break;
case TOK_SHM_SPECTRUM:
if(len>(FIFO_PATHNAME_SIZE-1))
{
rig_debug(RIG_DEBUG_WARN, "%s: set spectrum_path %s is too long\n", __FUNCTION__, val);
return -RIG_EINVAL;
}
memset(priv->spectrum_buf.path, 0, FIFO_PATHNAME_SIZE);
strcpy(priv->spectrum_buf.path, val);
rig_debug(RIG_DEBUG_VERBOSE, "%s: set spectrum_path %s\n", __FUNCTION__, priv->spectrum_buf.path);
}
return RIG_OK;
}
int g313_get_conf(RIG *rig, token_t token, char *val)
{
struct g313_priv_data *priv = (struct g313_priv_data *)rig->state.priv;
switch(token)
{
case TOK_SHM_AUDIO:
strcpy(val, priv->audio_buf.path);
break;
case TOK_SHM_IF:
strcpy(val, priv->if_buf.path);
break;
case TOK_SHM_SPECTRUM:
strcpy(val, priv->spectrum_buf.path);
}
return RIG_OK;
}
/* no need to check return from write - if not all can be written, accept overruns */
static void g313_audio_callback(short* buffer, int count, void* arg)
{
struct g313_priv_data *priv = (struct g313_priv_data*)arg;
write(priv->audio_buf.fd, buffer, count*sizeof(short));
}
static void g313_if_callback(short* buffer, int count, void* arg)
{
struct g313_priv_data *priv = (struct g313_priv_data*)arg;
write(priv->if_buf.fd, buffer, count*sizeof(short));
}
static void g313_spectrum_callback(float* buffer, int count, void* arg)
{
struct g313_priv_data *priv = (struct g313_priv_data*)arg;
write(priv->spectrum_buf.fd, buffer, count*sizeof(float));
}
const struct rig_caps g313_caps =
{
.rig_model = RIG_MODEL_G313,
.model_name = "WR-G313",
.mfg_name = "Winradio",
.version = "0.1",
.copyright = "LGPL", /* This wrapper, not the G313 shared library or driver */
.status = RIG_STATUS_ALPHA,
.rig_type = RIG_TYPE_PCRECEIVER,
.port_type = RIG_PORT_NONE,
.targetable_vfo = 0,
.ptt_type = RIG_PTT_NONE,
.dcd_type = RIG_DCD_NONE,
.has_get_func = G313_FUNC,
.has_set_func = G313_FUNC,
.has_get_level = G313_LEVEL,
.has_set_level = RIG_LEVEL_SET(G313_LEVEL),
.has_get_parm = RIG_PARM_NONE,
.has_set_parm = RIG_PARM_NONE,
.ctcss_list = NULL,
.dcs_list = NULL,
.chan_list = { RIG_CHAN_END },
.transceive = RIG_TRN_OFF,
.max_ifshift = kHz(2),
.attenuator = { 20, RIG_DBLST_END, }, /* TBC */
.rx_range_list1 = { {.start = kHz(9),.end = MHz(30),.modes = G313_MODES,
.low_power = -1,.high_power = -1,.vfo = RIG_VFO_A},
RIG_FRNG_END, },
.tx_range_list1 = { RIG_FRNG_END, },
.rx_range_list2 = { {.start = kHz(9),.end = MHz(30),.modes = G313_MODES,
.low_power = -1,.high_power = -1,.vfo = RIG_VFO_A},
RIG_FRNG_END, },
.tx_range_list2 = { RIG_FRNG_END, },
.tuning_steps = { {G313_MODES,1},
RIG_TS_END, },
.filters = { {G313_MODES, kHz(12)},
RIG_FLT_END, },
.cfgparams = g313_cfg_params,
.set_conf = g313_set_conf,
.get_conf = g313_get_conf,
.rig_init = g313_init,
.rig_cleanup = g313_cleanup,
.rig_open = g313_open,
.rig_close = g313_close,
.set_freq = g313_set_freq,
.get_freq = g313_get_freq,
.set_powerstat = g313_set_powerstat,
.get_powerstat = g313_get_powerstat,
.set_level = g313_set_level,
.get_level = g313_get_level,
.get_info = g313_get_info,
};
#endif /* not _WIN32 */

Wyświetl plik

@ -0,0 +1,167 @@
#include <dlfcn.h>
#include <stdio.h>
#include <errno.h>
#include "wrg313api.h"
OPEN_DEVICE OpenDevice=0;
CLOSE_DEVICE CloseDevice=0;
SET_POWER SetPower=0;
GET_POWER GetPower=0;
SET_FREQUENCY SetFrequency=0;
GET_FREQUENCY GetFrequency=0;
GET_RADIO_INFO GetRadioInfo=0;
GET_RSSI GetRSSI=0;
GET_AGC GetAGC=0;
SET_AGC SetAGC=0;
SET_IF_GAIN SetIFGain=0;
GET_IF_GAIN GetIFGain=0;
SET_SOFT_AGC SetSoftAGC=0;
GET_SOFT_AGC GetSoftAGC=0;
SET_VOLUME SetVolume=0;
GET_VOLUME GetVolume=0;
SET_MODE SetMode=0;
GET_MODE GetMode=0;
GET_DEVICE_LIST GetDeviceList=0;
DESTROY_DEVICE_LIST DestroyDeviceList=0;
SET_ATTENUATOR SetAttenuator=0;
GET_ATTENUATOR GetAttenuator=0;
SET_IF_SHIFT SetIFShift=0;
GET_IF_SHIFT GetIFShift=0;
SET_IF_BANDWIDTH SetIFBandwidth=0;
GET_IF_BANDWIDTH GetIFBandwidth=0;
START_STREAMING StartStreaming=0;
STOP_STREAMING StopStreaming=0;
GET_RAW_SIGNAL_STRENGTH GetRawSignalStrength=0;
GET_SIGNAL_STRENGTH GetSignalStrength=0;
IS_DEVICE_CONNECTED IsDeviceConnected=0;
GET_INTERFACE GetInterface=0;
SET_CW_TONE SetCWTone=0;
GET_CW_TONE GetCWTone=0;
SET_FM_AF_SQUELCH_LEVEL SetFMAFSquelchLevel=0;
GET_FM_AF_SQUELCH_LEVEL GetFMAFSquelchLevel=0;
SET_NOTCH_FILTER SetNotchFilter=0;
GET_NOTCH_FILTER GetNotchFilter=0;
SET_NOISE_BLANKER SetNoiseBlanker=0;
GET_NOISE_BLANKER GetNoiseBlanker=0;
SET_ISB_AUDIO_CHANNEL SetISBAudioChannel=0;
GET_ISB_AUDIO_CHANNEL GetISBAudioChannel=0;
LOAD_CALIBRATION_FILE LoadCalibrationFile=0;
RESET_CALIBRATION ResetCalibration=0;
GET_API_VERSION GetAPIVersion=0;
void *hWRAPI=0;
int InitAPI(void)
{
if(hWRAPI)
{
return 1;
}
else
{
hWRAPI=dlopen("wrg313api.so",RTLD_LAZY);
if(hWRAPI==NULL)
{
fprintf(stderr,"Unable to load "WRG3APINAME" shared library (%s).\n",dlerror());
return 0;
}
else
{
GetAPIVersion=(GET_API_VERSION)dlsym(hWRAPI,"GetAPIVersion");
OpenDevice=(OPEN_DEVICE)dlsym(hWRAPI,"OpenDevice");
CloseDevice=(CLOSE_DEVICE)dlsym(hWRAPI,"CloseDevice");
SetPower=(SET_POWER)dlsym(hWRAPI,"SetPower");
GetPower=(GET_POWER)dlsym(hWRAPI,"GetPower");
SetFrequency=(SET_FREQUENCY)dlsym(hWRAPI,"SetFrequency");
GetFrequency=(GET_FREQUENCY)dlsym(hWRAPI,"GetFrequency");
GetRadioInfo=(GET_RADIO_INFO)dlsym(hWRAPI,"GetRadioInfo");
GetRSSI=(GET_RSSI)dlsym(hWRAPI,"GetRSSI");
GetAGC=(GET_AGC)dlsym(hWRAPI,"GetAGC");
SetAGC=(SET_AGC)dlsym(hWRAPI,"SetAGC");
SetIFGain=(SET_IF_GAIN)dlsym(hWRAPI,"SetIFGain");
GetIFGain=(GET_IF_GAIN)dlsym(hWRAPI,"GetIFGain");
GetDeviceList=(GET_DEVICE_LIST)dlsym(hWRAPI,"GetDeviceList");
DestroyDeviceList=(DESTROY_DEVICE_LIST)dlsym(hWRAPI,"DestroyDeviceList");
SetSoftAGC=(SET_SOFT_AGC)dlsym(hWRAPI,"SetSoftAGC");
GetSoftAGC=(GET_SOFT_AGC)dlsym(hWRAPI,"GetSoftAGC");
GetVolume=(GET_VOLUME)dlsym(hWRAPI,"GetVolume");
SetVolume=(SET_VOLUME)dlsym(hWRAPI,"SetVolume");
SetMode=(SET_MODE)dlsym(hWRAPI,"SetMode");
GetMode=(GET_MODE)dlsym(hWRAPI,"GetMode");
SetIFShift=(SET_IF_SHIFT)dlsym(hWRAPI,"SetIFShift");
GetIFShift=(GET_IF_SHIFT)dlsym(hWRAPI,"GetIFShift");
SetIFBandwidth=(SET_IF_BANDWIDTH)dlsym(hWRAPI,"SetIFBandwidth");
GetIFBandwidth=(GET_IF_BANDWIDTH)dlsym(hWRAPI,"GetIFBandwidth");
StartStreaming=(START_STREAMING)dlsym(hWRAPI,"StartStreaming");
StopStreaming=(STOP_STREAMING)dlsym(hWRAPI,"StopStreaming");
SetAttenuator=(SET_ATTENUATOR)dlsym(hWRAPI,"SetAttenuator");
GetAttenuator=(GET_ATTENUATOR)dlsym(hWRAPI,"GetAttenuator");
IsDeviceConnected=(IS_DEVICE_CONNECTED)dlsym(hWRAPI,"IsDeviceConnected");
GetInterface=(GET_INTERFACE)dlsym(hWRAPI,"GetInterface");
GetRawSignalStrength=(GET_RAW_SIGNAL_STRENGTH)dlsym(hWRAPI,"GetRawSignalStrength");
GetSignalStrength=(GET_SIGNAL_STRENGTH)dlsym(hWRAPI,"GetSignalStrength");
SetCWTone=(SET_CW_TONE)dlsym(hWRAPI,"SetCWTone");
GetCWTone=(GET_CW_TONE)dlsym(hWRAPI,"GetCWTone");
SetFMAFSquelchLevel=(SET_FM_AF_SQUELCH_LEVEL)dlsym(hWRAPI,"SetFMAFSquelchLevel");
GetFMAFSquelchLevel=(GET_FM_AF_SQUELCH_LEVEL)dlsym(hWRAPI,"GetFMAFSquelchLevel");
SetNotchFilter=(SET_NOTCH_FILTER)dlsym(hWRAPI,"SetNotchFilter");
GetNotchFilter=(GET_NOTCH_FILTER)dlsym(hWRAPI,"GetNotchFilter");
SetNoiseBlanker=(SET_NOISE_BLANKER)dlsym(hWRAPI,"SetNoiseBlanker");
GetNoiseBlanker=(GET_NOISE_BLANKER)dlsym(hWRAPI,"GetNoiseBlanker");
SetISBAudioChannel=(SET_ISB_AUDIO_CHANNEL)dlsym(hWRAPI,"SetISBAudioChannel");
GetISBAudioChannel=(GET_ISB_AUDIO_CHANNEL)dlsym(hWRAPI,"GetISBAudioChannel");
LoadCalibrationFile=(LOAD_CALIBRATION_FILE)dlsym(hWRAPI,"LoadCalibrationFile");
ResetCalibration=(RESET_CALIBRATION)dlsym(hWRAPI,"ResetCalibration");
if(!GetAPIVersion || !OpenDevice || !CloseDevice || !SetPower || !GetPower || !GetFrequency || !SetFrequency ||
!GetRadioInfo || !GetRSSI || !GetAGC || !SetAGC ||
!GetIFGain || !SetIFGain || !SetSoftAGC || !GetSoftAGC || !SetVolume || !GetVolume || !GetMode ||
!SetMode || !GetDeviceList || !DestroyDeviceList || !ResetCalibration ||
!StartStreaming || !StopStreaming || !LoadCalibrationFile ||
!SetAttenuator || !GetAttenuator || !GetSignalStrength ||
!SetIFShift || !SetIFBandwidth || !GetIFBandwidth || !GetIFShift ||
!GetRawSignalStrength || !IsDeviceConnected || !GetInterface ||
!SetCWTone || !GetCWTone || !SetFMAFSquelchLevel || !GetFMAFSquelchLevel ||
!SetNotchFilter || !GetNotchFilter || !SetNoiseBlanker || !GetNoiseBlanker ||
!SetISBAudioChannel || !GetISBAudioChannel)
{
fprintf(stderr,"Unable to load valid "WRG3APINAME" library.\n");
dlclose(hWRAPI);
hWRAPI=0;
return 0;
}
return 1;
}
}
}
void UninitAPI(void)
{
if(hWRAPI)
{
dlclose(hWRAPI);
hWRAPI=0;
}
}

Wyświetl plik

@ -0,0 +1,172 @@
#ifndef __WRG313_API_H__
#define __WRG313_API_H__
#include <linux/types.h>
#define WRG3APINAME "wrg313api"
#define RADIOMODE_AM 0
#define RADIOMODE_SAM 1
#define RADIOMODE_LSB 2
#define RADIOMODE_USB 3
#define RADIOMODE_DSB 4
#define RADIOMODE_ISB 5
#define RADIOMODE_CW 6
#define RADIOMODE_FMN 7
#define AGC_NONE 0
#define AGC_SLOW 1
#define AGC_MEDIUM 2
#define AGC_FAST 3
#define INTERFACE_PCI 0
#define INTERFACE_USB 1
#pragma pack(push,1)
typedef struct
{
__u32 Size;
char SerNum[9];
char Model[9];
__u32 MinFreq;
__u32 MaxFreq;
__u8 NumBands;
__u32 BandFreq[16];
__u32 LOFreq;
__u8 NumVcos;
__u32 VcoFreq[8];
__u16 VcoDiv[8];
__u8 VcoBits[8];
__u32 RefClk1;
__u32 RefClk2;
__u8 IF1DAC[8];
__s32 AGCstart;
__s32 AGCmid;
__s32 AGCend;
__s32 DropLevel;
__s32 RSSItop;
__s32 RSSIref;
__s32 RxGain;
} RADIO_INFO;
typedef struct
{
char Path[64];
__u8 Interface;
RADIO_INFO Info;
} RADIO_DESC;
#pragma pack(pop)
#ifdef __cplusplus
extern "C"
{
#endif
typedef void (*IF_CALLBACK)(__s16 *Buffer,int Count,void *Context);
typedef void (*SPECTRUM_CALLBACK)(float *Spectrum,int Count,void *Context);
typedef void (*AUDIO_CALLBACK)(__s16 *AudioBuffer,int Count,void *UserData);
typedef int (*OPEN_DEVICE)(const char *DeviceName);
typedef void (*CLOSE_DEVICE)(int hRadio);
typedef int (*SET_POWER)(int hRadio,int Power);
typedef int (*GET_POWER)(int hRadio,int *Power);
typedef int (*GET_FREQUENCY)(int hRadio,unsigned int *Frequency);
typedef int (*SET_FREQUENCY)(int hRadio,unsigned int Frequency);
typedef int (*GET_RADIO_INFO)(int hRadio,RADIO_INFO *Info);
typedef int (*GET_RSSI)(int hRadio,int *RSSI);
typedef int (*GET_AGC)(int hRadio,int *AGC);
typedef int (*SET_AGC)(int hRadio,int AGC);
typedef int (*SET_IF_GAIN)(int hRadio,unsigned int Gain);
typedef int (*GET_IF_GAIN)(int hRadio,unsigned int *Gain);
typedef int (*SET_SOFT_AGC)(int hRadio,int AGC);
typedef int (*GET_SOFT_AGC)(int hRadio,int *AGC);
typedef int (*SET_VOLUME)(int hRadio,unsigned int Volume);
typedef int (*GET_VOLUME)(int hRadio,unsigned int *Volume);
typedef int (*SET_MODE)(int hRadio,int Mode);
typedef int (*GET_MODE)(int hRadio,int *Mode);
typedef int (*SET_IF_SHIFT)(int hRadio,int IFShift);
typedef int (*GET_IF_SHIFT)(int hRadio,int *IFShift);
typedef int (*SET_IF_BANDWIDTH)(int hRadio,unsigned int IFBandwidth);
typedef int (*GET_IF_BANDWIDTH)(int hRadio,unsigned int *IFBandwidth);
typedef int (*GET_DEVICE_LIST)(RADIO_DESC **List,int *Count);
typedef void (*DESTROY_DEVICE_LIST)(RADIO_DESC *List);
typedef int (*SET_ATTENUATOR)(int hRadio,int Attennutator);
typedef int (*GET_ATTENUATOR)(int hRadio,int *Attenuator);
typedef int (*START_STREAMING)(int hRadio,AUDIO_CALLBACK AudioCallback,IF_CALLBACK IFCallback,SPECTRUM_CALLBACK SpectrumCallback,void *Context);
typedef int (*STOP_STREAMING)(int hRadio);
typedef int (*GET_RAW_SIGNAL_STRENGTH)(int hRadio,unsigned char *Raw);
typedef int (*GET_SIGNAL_STRENGTH)(int hRadio,double *SignalStrength);
typedef int (*IS_DEVICE_CONNECTED)(int hRadio);
typedef int (*GET_INTERFACE)(int hRadio,int *Interface);
typedef int (*SET_CW_TONE)(int hRadio,unsigned int Frequency);
typedef int (*GET_CW_TONE)(int hRadio,unsigned int *Frequency);
typedef int (*SET_FM_AF_SQUELCH_LEVEL)(int hRadio,unsigned int Level);
typedef int (*GET_FM_AF_SQUELCH_LEVEL)(int hRadio,unsigned int *Level);
typedef int (*SET_NOTCH_FILTER)(int hRadio,int Active,int Frequency,unsigned int Bandwidth);
typedef int (*GET_NOTCH_FILTER)(int hRadio,int *Active,int *Frequency,unsigned int *Bandwidth);
typedef int (*SET_NOISE_BLANKER)(int hRadio,int Active,unsigned int Threshold);
typedef int (*GET_NOISE_BLANKER)(int hRadio,int *Active,unsigned int *Threshold);
typedef int (*SET_ISB_AUDIO_CHANNEL)(int hRadio,unsigned int Channel);
typedef int (*GET_ISB_AUDIO_CHANNEL)(int hRadio,unsigned int *Channel);
typedef int (*LOAD_CALIBRATION_FILE)(int hRadio,const char *Path);
typedef int (*RESET_CALIBRATION)(int hRadio);
typedef unsigned int (*GET_API_VERSION)(void);
#ifdef __cplusplus
};
#endif
extern OPEN_DEVICE OpenDevice;
extern CLOSE_DEVICE CloseDevice;
extern SET_POWER SetPower;
extern GET_POWER GetPower;
extern SET_FREQUENCY SetFrequency;
extern GET_FREQUENCY GetFrequency;
extern GET_RADIO_INFO GetRadioInfo;
extern GET_RSSI GetRSSI;
extern GET_AGC GetAGC;
extern SET_AGC SetAGC;
extern SET_IF_GAIN SetIFGain;
extern GET_IF_GAIN GetIFGain;
extern SET_SOFT_AGC SetSoftAGC;
extern GET_SOFT_AGC GetSoftAGC;
extern SET_VOLUME SetVolume;
extern GET_VOLUME GetVolume;
extern SET_MODE SetMode;
extern GET_MODE GetMode;
extern SET_IF_SHIFT SetIFShift;
extern GET_IF_SHIFT GetIFShift;
extern SET_IF_BANDWIDTH SetIFBandwidth;
extern GET_IF_BANDWIDTH GetIFBandwidth;
extern GET_DEVICE_LIST GetDeviceList;
extern DESTROY_DEVICE_LIST DestroyDeviceList;
extern SET_ATTENUATOR SetAttenuator;
extern GET_ATTENUATOR GetAttenuator;
extern START_STREAMING StartStreaming;
extern STOP_STREAMING StopStreaming;
extern GET_RAW_SIGNAL_STRENGTH GetRawSignalStrength;
extern GET_SIGNAL_STRENGTH GetSignalStrength;
extern IS_DEVICE_CONNECTED IsDeviceConnected;
extern GET_INTERFACE GetInterface;
extern SET_CW_TONE SetCWTone;
extern GET_CW_TONE GetCWTone;
extern SET_FM_AF_SQUELCH_LEVEL SetFMAFSquelchLevel;
extern GET_FM_AF_SQUELCH_LEVEL GetFMAFSquelchLevel;
extern SET_NOTCH_FILTER SetNotchFilter;
extern GET_NOTCH_FILTER GetNotchFilter;
extern SET_NOISE_BLANKER SetNoiseBlanker;
extern GET_NOISE_BLANKER GetNoiseBlanker;
extern SET_ISB_AUDIO_CHANNEL SetISBAudioChannel;
extern GET_ISB_AUDIO_CHANNEL GetISBAudioChannel;
extern LOAD_CALIBRATION_FILE LoadCalibrationFile;
extern RESET_CALIBRATION ResetCalibration;
extern GET_API_VERSION GetAPIVersion;
int InitAPI(void);
void UninitAPI(void);
#endif

Wyświetl plik

@ -248,8 +248,8 @@ DECLARE_INITRIG_BACKEND(winradio)
#ifdef _WIN32
rig_register(&g303_caps);
rig_register(&g305_caps);
rig_register(&g313_caps);
#endif
rig_register(&g313_caps);
return RIG_OK;
}