limesdr: try to select an appropriate antenna based on the limesuite antenna metadata.

This commit is contained in:
Oliver Jowett 2020-08-03 18:02:27 +08:00
parent b70898cd27
commit 9520740a12
1 changed files with 49 additions and 4 deletions

View File

@ -153,6 +153,51 @@ bool limesdrHandleOption(int argc, char **argv, int *jptr)
return true; return true;
} }
static size_t selectAntenna()
{
int result = LMS_PATH_AUTO;
lms_name_t *names = NULL;
int numAntennas = LMS_GetAntennaList(LimeSDR.dev, LMS_CH_RX, LimeSDR.stream.channel, NULL);
if (numAntennas <= 0) {
limesdrLogHandler(LMS_LOG_ERROR, "unable to get antenna list");
goto done;
}
names = calloc(numAntennas, sizeof(lms_name_t));
if (!names) {
limesdrLogHandler(LMS_LOG_ERROR, "unable to get antenna list");
goto done;
}
numAntennas = LMS_GetAntennaList(LimeSDR.dev, LMS_CH_RX, LimeSDR.stream.channel, names);
if (numAntennas < 0) {
limesdrLogHandler(LMS_LOG_ERROR, "unable to get antenna list");
goto done;
}
for (int i = 0; i < numAntennas; ++i) {
lms_range_t range;
if (LMS_GetAntennaBW(LimeSDR.dev, LMS_CH_RX, LimeSDR.stream.channel, i, &range) < 0) {
fprintf(stderr, "limesdr: unable to get antenna bandwidth for antenna %d (%s)", i, names[i]);
continue;
}
if (range.min <= Modes.freq && range.max >= Modes.freq) {
fprintf(stderr, "limesdr: selected rx antenna %d (%s) with bandwidth %.1f .. %.1fMHz", i, names[i], range.min / 1e6, range.max / 1e6);
result = i;
goto done;
}
}
done:
if (result == LMS_PATH_AUTO)
limesdrLogHandler(LMS_LOG_INFO, "limesdr: no suitable antenna found, letting LimeSuite do automatic antenna selection");
if (names)
free(names);
return result;
}
bool limesdrOpen(void) bool limesdrOpen(void)
{ {
const size_t devCountMax = 8; const size_t devCountMax = 8;
@ -208,13 +253,13 @@ bool limesdrOpen(void)
goto error; goto error;
} }
if (LMS_SetLOFrequency(LimeSDR.dev, LMS_CH_RX, LimeSDR.stream.channel, Modes.freq)) { if (LMS_SetAntenna(LimeSDR.dev, LMS_CH_RX, LimeSDR.stream.channel, selectAntenna())) {
limesdrLogHandler(LMS_LOG_ERROR, "unable to set frequency"); limesdrLogHandler(LMS_LOG_ERROR, "unable to set RF port");
goto error; goto error;
} }
if (LMS_SetAntenna(LimeSDR.dev, LMS_CH_RX, LimeSDR.stream.channel, LMS_PATH_LNAL)) { if (LMS_SetLOFrequency(LimeSDR.dev, LMS_CH_RX, LimeSDR.stream.channel, Modes.freq)) {
limesdrLogHandler(LMS_LOG_ERROR, "unable to set RF port"); limesdrLogHandler(LMS_LOG_ERROR, "unable to set frequency");
goto error; goto error;
} }