Merge pull request #1544 from srcejon/android

Airspy and RTL SDR support on Android
pull/1546/head
Edouard Griffiths 2022-12-22 17:04:00 +01:00 zatwierdzone przez GitHub
commit b387de17bc
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
9 zmienionych plików z 187 dodań i 1 usunięć

Wyświetl plik

@ -58,6 +58,7 @@ target_link_libraries(${TARGET_NAME}
${TARGET_LIB_GUI}
swagger
${LIBAIRSPY_LIBRARIES}
${LIBUSB_LIBRARIES}
)
install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})

Wyświetl plik

@ -37,6 +37,9 @@
#include "dsp/dspengine.h"
#include "airspysettings.h"
#include "airspyworker.h"
#ifdef ANDROID
#include "util/android.h"
#endif
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgConfigureAirspy, Message)
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgStartStop, Message)
@ -110,6 +113,20 @@ bool AirspyInput::openDevice()
return false;
}
#ifdef ANDROID
int fd;
QString serial = m_deviceAPI->getSamplingDeviceSerial();
if ((fd = Android::openUSBDevice(serial)) < 0)
{
qCritical("AirspyInput::openDevice: could not open USB device %s", qPrintable(serial));
return false;
}
if (airspy_open_fd(&m_dev, fd) != AIRSPY_SUCCESS)
{
qCritical("AirspyInput::openDevice: could not open Airspy: %s", qPrintable(serial));
return false;
}
#else
int device = m_deviceAPI->getSamplingDeviceSequence();
if ((m_dev = open_airspy_from_sequence(device)) == 0)
@ -117,6 +134,7 @@ bool AirspyInput::openDevice()
qCritical("AirspyInput::start: could not open Airspy #%d", device);
return false;
}
#endif
#ifdef LIBAIRSPY_DEFAULT_RATES
qDebug("AirspyInput::start: detault rates");

Wyświetl plik

@ -28,6 +28,9 @@
#include "plugin/pluginapi.h"
#include "util/simpleserializer.h"
#ifdef ANDROID
#include "util/android.h"
#endif
const int AirspyPlugin::m_maxDevices = 32;
@ -65,6 +68,29 @@ void AirspyPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& or
return;
}
#ifdef ANDROID
QStringList serialStrings = Android::listUSBDeviceSerials(0x1d50, 0x60a1);
int deviceNo = 0;
for (const auto serialString : serialStrings)
{
QString displayableName(QString("Airspy[%1] %2").arg(deviceNo).arg(serialString));
originDevices.append(OriginDevice(
displayableName,
m_hardwareID,
serialString,
deviceNo,
1,
0
));
deviceNo++;
}
listedHwIds.append(m_hardwareID);
#else
airspy_read_partid_serialno_t read_partid_serialno;
struct airspy_device *devinfo;
uint32_t serial_msb = 0;
@ -130,6 +156,8 @@ void AirspyPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& or
qDebug("AirspyPlugin::enumOriginDevices: airspy_exit: %s", airspy_error_name(rc));
listedHwIds.append(m_hardwareID);
#endif
}
PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources(const OriginDevices& originDevices)

Wyświetl plik

@ -36,6 +36,9 @@
#include "airspyhfplugin.h"
#include "airspyhfsettings.h"
#include "airspyhfworker.h"
#ifdef ANDROID
#include "util/android.h"
#endif
MESSAGE_CLASS_DEFINITION(AirspyHFInput::MsgConfigureAirspyHF, Message)
MESSAGE_CLASS_DEFINITION(AirspyHFInput::MsgStartStop, Message)
@ -581,7 +584,13 @@ airspyhf_device_t *AirspyHFInput::open_airspyhf_from_serial(const QString& seria
}
else
{
#ifdef ANDROID
QString serialString = QString("AIRSPYHF SN:%1").arg(serial, 0, 16).toUpper();
int fd = Android::openUSBDevice(serialString);
rc = (airspyhf_error) airspyhf_open_fd(&devinfo, fd);
#else
rc = (airspyhf_error) airspyhf_open_sn(&devinfo, serial);
#endif
if (rc == AIRSPYHF_SUCCESS) {
return devinfo;

Wyświetl plik

@ -27,7 +27,9 @@
#else
#include "airspyhfgui.h"
#endif
#ifdef ANDROID
#include "util/android.h"
#endif
const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = {
QStringLiteral("AirspyHF"),
@ -67,7 +69,35 @@ void AirspyHFPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices&
int nbDevices;
uint64_t deviceSerials[m_maxDevices];
#ifdef ANDROID
QStringList serialStrings = Android::listUSBDeviceSerials(0x03EB, 0x800C);
nbDevices = 0;
for (const auto serialString : serialStrings)
{
// Serials are of the form: "AIRSPYHF SN:12345678ABCDEF00"
int idx = serialString.indexOf(':');
if (idx != -1)
{
bool ok;
uint64_t serialInt = serialString.mid(idx+1).toULongLong(&ok, 16);
if (ok)
{
deviceSerials[nbDevices] = serialInt;
nbDevices++;
}
else
{
qDebug() << "AirspyHFPlugin::enumOriginDevices: Couldn't convert " << serialString.mid(idx+1) << " to integer";
}
}
else
{
qDebug() << "AirspyHFPlugin::enumOriginDevices: No : in serial " << serialString;
}
}
#else
nbDevices = airspyhf_list_devices(deviceSerials, m_maxDevices);
#endif
if (nbDevices < 0)
{

Wyświetl plik

@ -73,6 +73,7 @@ void AudioInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices
1, // nb Rx
0 // nb Tx
));
listedHwIds.append(m_hardwareID);
}
PluginInterface::SamplingDevices AudioInputPlugin::enumSampleSources(const OriginDevices& originDevices)

Wyświetl plik

@ -54,6 +54,7 @@ target_link_libraries(${TARGET_NAME}
${TARGET_LIB_GUI}
swagger
${LIBRTLSDR_LIBRARIES}
${LIBUSB_LIBRARIES}
)
install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})

Wyświetl plik

@ -35,6 +35,9 @@
#include "rtlsdrthread.h"
#include "dsp/dspcommands.h"
#include "dsp/dspengine.h"
#ifdef ANDROID
#include "util/android.h"
#endif
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgConfigureRTLSDR, Message)
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgStartStop, Message)
@ -115,6 +118,19 @@ bool RTLSDRInput::openDevice()
int device;
#ifdef ANDROID
int fd;
if ((fd = Android::openUSBDevice(m_deviceAPI->getSamplingDeviceSerial())) < 0)
{
qCritical("RTLSDRInput::openDevice: could not open USB device %s", qPrintable(m_deviceAPI->getSamplingDeviceSerial()));
return false;
}
if ((res = rtlsdr_open_fd(&m_dev, fd)) < 0)
{
qCritical("RTLSDRInput::openDevice: could not open RTLSDR: %s", strerror(errno));
return false;
}
#else
if ((device = rtlsdr_get_index_by_serial(qPrintable(m_deviceAPI->getSamplingDeviceSerial()))) < 0)
{
qCritical("RTLSDRInput::openDevice: could not get RTLSDR serial number");
@ -126,6 +142,7 @@ bool RTLSDRInput::openDevice()
qCritical("RTLSDRInput::openDevice: could not open RTLSDR #%d: %s", device, strerror(errno));
return false;
}
#endif
vendor[0] = '\0';
product[0] = '\0';

Wyświetl plik

@ -11,6 +11,9 @@
#endif
#include "rtlsdrplugin.h"
#include "rtlsdrwebapiadapter.h"
#ifdef ANDROID
#include "util/android.h"
#endif
const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = {
QStringLiteral("RTLSDR"),
@ -46,6 +49,83 @@ void RTLSDRPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& or
return;
}
#ifdef ANDROID
typedef struct rtlsdr_dongle {
uint16_t vid;
uint16_t pid;
const char *name;
} rtlsdr_dongle_t;
// This list comes from librtlsdr.c
rtlsdr_dongle_t known_devices[] = {
{ 0x0bda, 0x2832, "Generic RTL2832U" },
{ 0x0bda, 0x2838, "Generic RTL2832U OEM" },
{ 0x0413, 0x6680, "DigitalNow Quad DVB-T PCI-E card" },
{ 0x0413, 0x6f0f, "Leadtek WinFast DTV Dongle mini D" },
{ 0x0458, 0x707f, "Genius TVGo DVB-T03 USB dongle (Ver. B)" },
{ 0x0ccd, 0x00a9, "Terratec Cinergy T Stick Black (rev 1)" },
{ 0x0ccd, 0x00b3, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" },
{ 0x0ccd, 0x00b4, "Terratec Deutschlandradio DAB Stick" },
{ 0x0ccd, 0x00b5, "Terratec NOXON DAB Stick - Radio Energy" },
{ 0x0ccd, 0x00b7, "Terratec Media Broadcast DAB Stick" },
{ 0x0ccd, 0x00b8, "Terratec BR DAB Stick" },
{ 0x0ccd, 0x00b9, "Terratec WDR DAB Stick" },
{ 0x0ccd, 0x00c0, "Terratec MuellerVerlag DAB Stick" },
{ 0x0ccd, 0x00c6, "Terratec Fraunhofer DAB Stick" },
{ 0x0ccd, 0x00d3, "Terratec Cinergy T Stick RC (Rev.3)" },
{ 0x0ccd, 0x00d7, "Terratec T Stick PLUS" },
{ 0x0ccd, 0x00e0, "Terratec NOXON DAB/DAB+ USB dongle (rev 2)" },
{ 0x1554, 0x5020, "PixelView PV-DT235U(RN)" },
{ 0x15f4, 0x0131, "Astrometa DVB-T/DVB-T2" },
{ 0x15f4, 0x0133, "HanfTek DAB+FM+DVB-T" },
{ 0x185b, 0x0620, "Compro Videomate U620F"},
{ 0x185b, 0x0650, "Compro Videomate U650F"},
{ 0x185b, 0x0680, "Compro Videomate U680F"},
{ 0x1b80, 0xd393, "GIGABYTE GT-U7300" },
{ 0x1b80, 0xd394, "DIKOM USB-DVBT HD" },
{ 0x1b80, 0xd395, "Peak 102569AGPK" },
{ 0x1b80, 0xd397, "KWorld KW-UB450-T USB DVB-T Pico TV" },
{ 0x1b80, 0xd398, "Zaapa ZT-MINDVBZP" },
{ 0x1b80, 0xd39d, "SVEON STV20 DVB-T USB & FM" },
{ 0x1b80, 0xd3a4, "Twintech UT-40" },
{ 0x1b80, 0xd3a8, "ASUS U3100MINI_PLUS_V2" },
{ 0x1b80, 0xd3af, "SVEON STV27 DVB-T USB & FM" },
{ 0x1b80, 0xd3b0, "SVEON STV21 DVB-T USB & FM" },
{ 0x1d19, 0x1101, "Dexatek DK DVB-T Dongle (Logilink VG0002A)" },
{ 0x1d19, 0x1102, "Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0)" },
{ 0x1d19, 0x1103, "Dexatek Technology Ltd. DK 5217 DVB-T Dongle" },
{ 0x1d19, 0x1104, "MSI DigiVox Micro HD" },
{ 0x1f4d, 0xa803, "Sweex DVB-T USB" },
{ 0x1f4d, 0xb803, "GTek T803" },
{ 0x1f4d, 0xc803, "Lifeview LV5TDeluxe" },
{ 0x1f4d, 0xd286, "MyGica TD312" },
{ 0x1f4d, 0xd803, "PROlectrix DV107669" },
};
int deviceNo = 0;
for (int i = 0; i < sizeof(known_devices)/sizeof(rtlsdr_dongle_t); i++)
{
QStringList serialStrings = Android::listUSBDeviceSerials(known_devices[i].vid, known_devices[i].pid);
for (const auto serial : serialStrings)
{
QString displayableName(QString("RTL-SDR[%1] %2").arg(deviceNo).arg(serial));
originDevices.append(OriginDevice(
displayableName,
m_hardwareID,
serial,
deviceNo, // sequence
1, // Nb Rx
0 // Nb Tx
));
deviceNo++;
}
}
listedHwIds.append(m_hardwareID);
#else
int count = rtlsdr_get_device_count();
char vendor[256];
char product[256];
@ -72,6 +152,7 @@ void RTLSDRPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& or
}
listedHwIds.append(m_hardwareID);
#endif
}
PluginInterface::SamplingDevices RTLSDRPlugin::enumSampleSources(const OriginDevices& originDevices)