Skip to content

Commit 572e97e

Browse files
committed
changed open function. Added support for android
1 parent 2626ee4 commit 572e97e

File tree

1 file changed

+142
-51
lines changed

1 file changed

+142
-51
lines changed

python_bladerf/pylibbladerf/pybladerf.pyx

Lines changed: 142 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,19 @@
2323
# cython: language_level=3str
2424
from python_bladerf import __version__
2525
from libc.stdint cimport uint8_t, int16_t, uint16_t, int32_t, uint32_t, uint64_t, uintptr_t
26+
from libc.string cimport memcpy, memset, strncpy
2627
from cpython cimport Py_INCREF, Py_DECREF
2728
from libc.stdlib cimport malloc, free
28-
from libc.string cimport memcpy
2929
from enum import IntEnum
3030
from ctypes import c_int
3131
from . cimport cbladerf
3232
import numpy as np
3333
cimport cython
3434

35+
IF ANDROID:
36+
from .__android import get_bladerf_device_list
37+
38+
3539
cdef dict global_callbacks = {}
3640

3741
def PYBLADERF_CHANNEL_RX(channel: int) -> int:
@@ -408,15 +412,18 @@ class pybladerf_sweep_style(IntEnum):
408412
cdef class pybladerf_devinfo:
409413

410414
def __init__(self,
411-
backend: pybladerf_backend = None,
412-
serial: str = None,
413-
usb_bus: int = None,
414-
usb_addr: int = None,
415-
instance: int = None,
415+
backend: pybladerf_backend = pybladerf_backend.PYBLADERF_BACKEND_ANY,
416+
serial: str = 'ANY',
417+
usb_bus: int = 255,
418+
usb_addr: int = 255,
419+
instance: int = 4294967295,
416420
manufacturer: str = None,
417421
product: str = None) -> None:
418422

419423
self.__bladerf_devinfo = <cbladerf.bladerf_devinfo*> malloc(sizeof(cbladerf.bladerf_devinfo))
424+
memset(self.__bladerf_devinfo.serial, 0, cbladerf.BLADERF_SERIAL_LENGTH)
425+
memset(self.__bladerf_devinfo.product, 0, cbladerf.BLADERF_DESCRIPTION_LENGTH)
426+
memset(self.__bladerf_devinfo.manufacturer, 0, cbladerf.BLADERF_DESCRIPTION_LENGTH)
420427

421428
self.backend = backend
422429
self.serial = serial
@@ -450,7 +457,7 @@ cdef class pybladerf_devinfo:
450457

451458
def __set__(self, value: str) -> None:
452459
if value is not None and self.__bladerf_devinfo != NULL:
453-
self.__bladerf_devinfo[0].serial = value.encode('utf-8')
460+
strncpy(self.__bladerf_devinfo[0].serial, value.encode('utf-8'), cbladerf.BLADERF_SERIAL_LENGTH - 1)
454461

455462
property usb_bus:
456463
def __get__(self) -> int:
@@ -486,7 +493,7 @@ cdef class pybladerf_devinfo:
486493

487494
def __set__(self, value: str) -> None:
488495
if value is not None and self.__bladerf_devinfo != NULL:
489-
self.__bladerf_devinfo[0].manufacturer = value.encode('utf-8')
496+
strncpy(self.__bladerf_devinfo[0].manufacturer, value.encode('utf-8'), cbladerf.BLADERF_DESCRIPTION_LENGTH - 1)
490497

491498
property product:
492499
def __get__(self) -> str:
@@ -495,7 +502,7 @@ cdef class pybladerf_devinfo:
495502

496503
def __set__(self, value: str) -> None:
497504
if value is not None and self.__bladerf_devinfo != NULL:
498-
self.__bladerf_devinfo[0].product = value.encode('utf-8')
505+
strncpy(self.__bladerf_devinfo[0].product, value.encode('utf-8'), cbladerf.BLADERF_DESCRIPTION_LENGTH - 1)
499506

500507
cdef cbladerf.bladerf_devinfo *get_ptr(self):
501508
return self.__bladerf_devinfo
@@ -1019,52 +1026,97 @@ cdef class pybladerf_stream:
10191026
return &self.__bladerf_stream
10201027

10211028
# ---- WRAPPER ---- #
1022-
cdef class PyBladeRFDeviceList:
1029+
IF ANDROID:
1030+
cdef class PyBladeRFDeviceList:
1031+
cdef list __bladerf_device_list
10231032

1024-
def __cinit__(self):
1025-
self._device_count = cbladerf.bladerf_get_device_list(&self.__bladerf_device_list)
1033+
def __cinit__(self):
1034+
self.__bladerf_device_list = get_bladerf_device_list()
10261035

1027-
def __dealloc__(self):
1028-
if self.__bladerf_device_list != NULL:
1029-
cbladerf.bladerf_free_device_list(self.__bladerf_device_list)
1036+
property device_count:
1037+
def __get__(self):
1038+
return len(self.__bladerf_device_list)
10301039

1031-
property device_count:
1032-
def __get__(self) -> int:
1040+
property devstrs:
1041+
def __get__(self) -> list[str]:
1042+
return [f'libusb:instance={self.__bladerf_device_list[i][0]} serial={self.__bladerf_device_list[i][1]}' for i in range(self.device_count)]
1043+
1044+
property backends:
1045+
def __get__(self) -> list[pybladerf_backend]:
1046+
return ['libusb' for i in range(self.device_count)]
1047+
1048+
property serial_numbers:
1049+
def __get__(self) -> list[str]:
1050+
return [self.__bladerf_device_list[i][1] for i in range(self.device_count)]
1051+
1052+
property usb_buses:
1053+
def __get__(self) -> list[int]:
1054+
return [255 for i in range(self.device_count)]
1055+
1056+
property usb_addresses:
1057+
def __get__(self) -> list[int]:
1058+
return [255 for i in range(self.device_count)]
1059+
1060+
property instances:
1061+
def __get__(self) -> list[int]:
1062+
return [self.__bladerf_device_list[i][0] for i in range(self.device_count)]
1063+
1064+
property manufacturers:
1065+
def __get__(self) -> list[str]:
1066+
return [self.__bladerf_device_list[i][2] for i in range(self.device_count)]
1067+
1068+
property products:
1069+
def __get__(self) -> list[str]:
1070+
return [self.__bladerf_device_list[i][3] for i in range(self.device_count)]
1071+
ELSE:
1072+
cdef class PyBladeRFDeviceList:
1073+
cdef cbladerf.bladerf_devinfo *__bladerf_device_list
1074+
cdef int _device_count
1075+
1076+
def __cinit__(self):
1077+
self._device_count = cbladerf.bladerf_get_device_list(&self.__bladerf_device_list)
1078+
1079+
def __dealloc__(self):
10331080
if self.__bladerf_device_list != NULL:
1034-
return self._device_count
1035-
return 0
1081+
cbladerf.bladerf_free_device_list(self.__bladerf_device_list)
1082+
1083+
property device_count:
1084+
def __get__(self) -> int:
1085+
if self.__bladerf_device_list != NULL:
1086+
return self._device_count
1087+
return 0
10361088

1037-
property devstrs:
1038-
def __get__(self) -> list[str]:
1039-
return [f'{cbladerf.bladerf_backend_str(self.__bladerf_device_list[i].backend).decode("utf-8")}:device={self.__bladerf_device_list[i].usb_bus}:{self.__bladerf_device_list[i].usb_addr} instance={self.__bladerf_device_list[i].instance} serial={self.__bladerf_device_list[i].serial.decode("utf-8")}' for i in range(self.device_count)]
1089+
property devstrs:
1090+
def __get__(self) -> list[str]:
1091+
return [f'{cbladerf.bladerf_backend_str(self.__bladerf_device_list[i].backend).decode("utf-8")}:device={self.__bladerf_device_list[i].usb_bus}:{self.__bladerf_device_list[i].usb_addr} instance={self.__bladerf_device_list[i].instance} serial={self.__bladerf_device_list[i].serial.decode("utf-8")}' for i in range(self.device_count)]
10401092

1041-
property backends:
1042-
def __get__(self) -> list[pybladerf_backend]:
1043-
return [pybladerf_backend(self.__bladerf_device_list[i].backend) for i in range(self.device_count)]
1093+
property backends:
1094+
def __get__(self) -> list[pybladerf_backend]:
1095+
return [pybladerf_backend(self.__bladerf_device_list[i].backend) for i in range(self.device_count)]
10441096

1045-
property serial_numbers:
1046-
def __get__(self) -> list[str]:
1047-
return [self.__bladerf_device_list[i].serial.decode('utf-8') for i in range(self.device_count)]
1097+
property serial_numbers:
1098+
def __get__(self) -> list[str]:
1099+
return [self.__bladerf_device_list[i].serial.decode('utf-8') for i in range(self.device_count)]
10481100

1049-
property usb_buses:
1050-
def __get__(self) -> list[int]:
1051-
return [self.__bladerf_device_list[i].usb_bus for i in range(self.device_count)]
1101+
property usb_buses:
1102+
def __get__(self) -> list[int]:
1103+
return [self.__bladerf_device_list[i].usb_bus for i in range(self.device_count)]
10521104

1053-
property usb_addresses:
1054-
def __get__(self) -> list[int]:
1055-
return [self.__bladerf_device_list[i].usb_addr for i in range(self.device_count)]
1105+
property usb_addresses:
1106+
def __get__(self) -> list[int]:
1107+
return [self.__bladerf_device_list[i].usb_addr for i in range(self.device_count)]
10561108

1057-
property instances:
1058-
def __get__(self) -> list[int]:
1059-
return [self.__bladerf_device_list[i].instance for i in range(self.device_count)]
1109+
property instances:
1110+
def __get__(self) -> list[int]:
1111+
return [self.__bladerf_device_list[i].instance for i in range(self.device_count)]
10601112

1061-
property manufacturers:
1062-
def __get__(self) -> list[str]:
1063-
return [self.__bladerf_device_list[i].manufacturer.decode('utf-8') for i in range(self.device_count)]
1113+
property manufacturers:
1114+
def __get__(self) -> list[str]:
1115+
return [self.__bladerf_device_list[i].manufacturer.decode('utf-8') for i in range(self.device_count)]
10641116

1065-
property products:
1066-
def __get__(self) -> list[str]:
1067-
return [self.__bladerf_device_list[i].product.decode('utf-8') for i in range(self.device_count)]
1117+
property products:
1118+
def __get__(self) -> list[str]:
1119+
return [self.__bladerf_device_list[i].product.decode('utf-8') for i in range(self.device_count)]
10681120

10691121
cdef struct pybladerf_async_data:
10701122
pass
@@ -1990,23 +2042,62 @@ cdef class PyBladerfDevice:
19902042

19912043
raise RuntimeError(f'set_tx_complete_callback() failed: Device not initialized!')
19922044

1993-
def pybladerf_open(device_identifier: str = '') -> PyBladerfDevice:
1994-
if device_identifier is None:
1995-
device_identifier = ''
1996-
2045+
def pybladerf_open() -> PyBladerfDevice | None:
19972046
cdef PyBladerfDevice pybladerf_device = PyBladerfDevice()
1998-
result = cbladerf.bladerf_open(pybladerf_device.get_double_ptr(), device_identifier.encode('utf-8'))
2047+
2048+
IF ANDROID:
2049+
result = -7
2050+
bladerf_device_list = get_bladerf_device_list(1)
2051+
if len(bladerf_device_list):
2052+
devinfo = pybladerf_devinfo(backend=pybladerf_backend.PYBLADERF_BACKEND_LIBUSB, instance=bladerf_device_list[0][0])
2053+
result = cbladerf.bladerf_open_with_devinfo(pybladerf_device.get_double_ptr(), devinfo.get_ptr())
2054+
ELSE:
2055+
result = cbladerf.bladerf_open(pybladerf_device.get_double_ptr(), NULL)
2056+
19992057
raise_error('pybladerf_open()', result)
20002058
pybladerf_device._setup_device()
20012059
return pybladerf_device
20022060

2003-
def pybladerf_open_with_devinfo(devinfo: pybladerf_devinfo) -> PyBladerfDevice:
2061+
def pybladerf_open_by_serial(desired_serial_number: str) -> PyBladerfDevice | None:
2062+
if desired_serial_number in (None, ''):
2063+
return pybladerf_open()
2064+
20042065
cdef PyBladerfDevice pybladerf_device = PyBladerfDevice()
2005-
result = cbladerf.bladerf_open_with_devinfo(pybladerf_device.get_double_ptr(), devinfo.get_ptr())
2006-
raise_error('pybladerf_open_with_devinfo()', result)
2066+
IF ANDROID:
2067+
result = -7
2068+
bladerf_device_list = get_bladerf_device_list(1)
2069+
if len(bladerf_device_list):
2070+
for file_descriptor, serial_number, manufacturer, product in bladerf_device_list:
2071+
if serial_number == desired_serial_number:
2072+
devinfo = pybladerf_devinfo(backend=pybladerf_backend.PYBLADERF_BACKEND_LIBUSB, instance=file_descriptor)
2073+
result = cbladerf.bladerf_open_with_devinfo(pybladerf_device.get_double_ptr(), devinfo.get_ptr())
2074+
ELSE:
2075+
device_identifier = f'*:serial={desired_serial_number}'
2076+
result = cbladerf.bladerf_open(pybladerf_device.get_double_ptr(), device_identifier.encode('utf-8'))
2077+
2078+
raise_error('pybladerf_open_by_serial()', result)
20072079
pybladerf_device._setup_device()
20082080
return pybladerf_device
20092081

2082+
def pybladerf_open_with_devinfo(devinfo: pybladerf_devinfo) -> PyBladerfDevice | None:
2083+
IF ANDROID:
2084+
if devinfo.serial != 'ANY':
2085+
devinfo.usb_addr = 255
2086+
devinfo.usb_bus = 255
2087+
devinfo.backend = pybladerf_backend.PYBLADERF_BACKEND_LIBUSB
2088+
2089+
return pybladerf_open_by_serial(devinfo.serial)
2090+
else:
2091+
return pybladerf_open()
2092+
2093+
ELSE:
2094+
cdef PyBladerfDevice pybladerf_device = PyBladerfDevice()
2095+
result = cbladerf.bladerf_open_with_devinfo(pybladerf_device.get_double_ptr(), devinfo.get_ptr())
2096+
2097+
raise_error('pybladerf_open_with_devinfo()', result)
2098+
pybladerf_device._setup_device()
2099+
return pybladerf_device
2100+
20102101
def pybladerf_get_devinfo_from_str(devstr: str) -> pybladerf_devinfo:
20112102
cdef pybladerf_devinfo info = pybladerf_devinfo()
20122103
result = cbladerf.bladerf_get_devinfo_from_str(devstr.encode('utf-8'), info.get_ptr())

0 commit comments

Comments
 (0)