mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04:00 
			
		
		
		
	Merge pull request #1544 from srcejon/android
Airspy and RTL SDR support on Android
This commit is contained in:
		
						commit
						b387de17bc
					
				| @ -58,6 +58,7 @@ target_link_libraries(${TARGET_NAME} | ||||
| 	${TARGET_LIB_GUI} | ||||
|     swagger | ||||
|     ${LIBAIRSPY_LIBRARIES} | ||||
|     ${LIBUSB_LIBRARIES} | ||||
| ) | ||||
| 
 | ||||
| install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER}) | ||||
|  | ||||
| @ -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"); | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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) | ||||
|     { | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -54,6 +54,7 @@ target_link_libraries(${TARGET_NAME} | ||||
| 	${TARGET_LIB_GUI} | ||||
|         swagger | ||||
|         ${LIBRTLSDR_LIBRARIES} | ||||
|         ${LIBUSB_LIBRARIES} | ||||
| ) | ||||
| 
 | ||||
| install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER}) | ||||
|  | ||||
| @ -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'; | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user