Skip to content

Commit a9aa8b2

Browse files
committed
merged features for android
1 parent 96c6735 commit a9aa8b2

File tree

2 files changed

+86
-27
lines changed

2 files changed

+86
-27
lines changed

python_hackrf/pylibhackrf/chackrf.pxd

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,3 +317,11 @@ cdef extern from 'hackrf.h':
317317
int hackrf_set_leds(hackrf_device *device, const uint8_t state)
318318

319319
int hackrf_set_user_bias_t_opts(hackrf_device *device, hackrf_bias_t_user_settting_req *req)
320+
321+
cdef extern from *:
322+
"""
323+
#ifdef ANDROID
324+
int hackrf_init_on_android();
325+
int hackrf_open_on_android(int fileDescriptor, hackrf_device **device);
326+
#endif
327+
"""

python_hackrf/pylibhackrf/pyhackrf.pyx

Lines changed: 78 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ from . cimport chackrf
3131
import numpy as np
3232
cimport cython
3333

34+
DEF ANDROID = False
35+
IF ANDROID:
36+
from .__android import get_hackrf_device_list
37+
3438

3539
cdef dict global_callbacks = {}
3640

@@ -192,36 +196,63 @@ cdef void __tx_flush_callback(void *flush_ctx, int success) noexcept nogil:
192196
global_callbacks[device_ptr]['__tx_flush_callback'](global_callbacks[device_ptr]['device'], success)
193197

194198

195-
cdef class PyHackRFDeviceList:
196-
cdef chackrf.hackrf_device_list_t *__hackrf_device_list
199+
IF ANDROID:
200+
cdef class PyHackRFDeviceList:
201+
cdef list __hackrf_device_list
197202

198-
cdef chackrf.hackrf_device_list_t *get_hackrf_device_list_ptr(self):
199-
return self.__hackrf_device_list
203+
def __cinit__(self):
204+
self.__hackrf_device_list = get_hackrf_device_list()
200205

201-
def __cinit__(self):
202-
self.__hackrf_device_list = chackrf.hackrf_device_list()
206+
property device_count:
207+
def __get__(self):
208+
return len(self.__hackrf_device_list)
203209

204-
def __dealloc__(self):
205-
if self.__hackrf_device_list is not NULL:
206-
chackrf.hackrf_device_list_free(self.__hackrf_device_list)
210+
property serial_numbers:
211+
def __get__(self):
212+
return [self.__hackrf_device_list[i][2] for i in range(self.device_count)]
213+
214+
property usb_board_ids:
215+
def __get__(self):
216+
return [self.__hackrf_device_list[i][1] for i in range(self.device_count)]
217+
218+
property file_descriptors:
219+
def __get__(self):
220+
return [self.__hackrf_device_list[i][0] for i in range(self.device_count)]
221+
222+
def pyhackrf_board_id_name(self, index: int) -> str:
223+
if len(self.__hackrf_device_list):
224+
return chackrf.hackrf_board_id_name(self.__hackrf_device_list[index][1]).decode('utf-8')
225+
ELSE:
226+
cdef class PyHackRFDeviceList:
227+
cdef chackrf.hackrf_device_list_t *__hackrf_device_list
207228

208-
property device_count:
209-
def __get__(self):
229+
cdef chackrf.hackrf_device_list_t *get_hackrf_device_list_ptr(self):
230+
return self.__hackrf_device_list
231+
232+
def __cinit__(self):
233+
self.__hackrf_device_list = chackrf.hackrf_device_list()
234+
235+
def __dealloc__(self):
210236
if self.__hackrf_device_list is not NULL:
211-
return self.__hackrf_device_list[0].devicecount
212-
return 0
237+
chackrf.hackrf_device_list_free(self.__hackrf_device_list)
213238

214-
property serial_numbers:
215-
def __get__(self):
216-
return [self.__hackrf_device_list[0].serial_numbers[i].decode('utf-8') for i in range(self.device_count)]
239+
property device_count:
240+
def __get__(self):
241+
if self.__hackrf_device_list is not NULL:
242+
return self.__hackrf_device_list[0].devicecount
243+
return 0
217244

218-
property usb_board_ids:
219-
def __get__(self):
220-
return [self.__hackrf_device_list[0].usb_board_ids[i] for i in range(self.device_count)]
245+
property serial_numbers:
246+
def __get__(self):
247+
return [self.__hackrf_device_list[0].serial_numbers[i].decode('utf-8') for i in range(self.device_count)]
221248

222-
def pyhackrf_board_id_name(self, index: int) -> str:
223-
if self.__hackrf_device_list is not NULL:
224-
return chackrf.hackrf_board_id_name(self.__hackrf_device_list[0].usb_board_ids[index]).decode('utf-8')
249+
property usb_board_ids:
250+
def __get__(self):
251+
return [self.__hackrf_device_list[0].usb_board_ids[i] for i in range(self.device_count)]
252+
253+
def pyhackrf_board_id_name(self, index: int) -> str:
254+
if self.__hackrf_device_list is not NULL:
255+
return chackrf.hackrf_board_id_name(self.__hackrf_device_list[0].usb_board_ids[index]).decode('utf-8')
225256

226257
cdef class PyHackrfDevice:
227258

@@ -709,7 +740,10 @@ cdef class PyHackrfDevice:
709740

710741
# ---- initialization and exit ---- #
711742
def pyhackrf_init() -> None:
712-
result = chackrf.hackrf_init()
743+
IF ANDROID:
744+
result = chackrf.hackrf_init_on_android()
745+
ELSE:
746+
result = chackrf.hackrf_init()
713747
if result != chackrf.hackrf_error.HACKRF_SUCCESS:
714748
raise RuntimeError(f'pyhackrf_init() failed: {chackrf.hackrf_error_name(result).decode("utf-8")} ({result})')
715749

@@ -734,7 +768,10 @@ def pyhackrf_device_list() -> PyHackRFDeviceList:
734768

735769
def pyhackrf_device_list_open(pyhackrf_device_list: PyHackRFDeviceList, index: int) -> PyHackrfDevice | None:
736770
pyhackrf_device = PyHackrfDevice()
737-
result = chackrf.hackrf_device_list_open(pyhackrf_device_list.get_hackrf_device_list_ptr(), index, pyhackrf_device.get_hackrf_device_double_ptr())
771+
IF ANDROID:
772+
result = chackrf.hackrf_open_on_android(pyhackrf_device_list.file_descriptors[index], pyhackrf_device.get_hackrf_device_double_ptr())
773+
ELSE:
774+
result = chackrf.hackrf_device_list_open(pyhackrf_device_list.get_hackrf_device_list_ptr(), index, pyhackrf_device.get_hackrf_device_double_ptr())
738775

739776
if result == chackrf.hackrf_error.HACKRF_SUCCESS:
740777
pyhackrf_device._setup_device()
@@ -744,8 +781,13 @@ def pyhackrf_device_list_open(pyhackrf_device_list: PyHackRFDeviceList, index: i
744781

745782
def pyhackrf_open() -> PyHackrfDevice | None:
746783
pyhackrf_device = PyHackrfDevice()
747-
748-
result = chackrf.hackrf_open(pyhackrf_device.get_hackrf_device_double_ptr())
784+
IF ANDROID:
785+
result = chackrf.hackrf_error.HACKRF_ERROR_NOT_FOUND
786+
hackrf_device_list = get_hackrf_device_list(1)
787+
if len(hackrf_device_list):
788+
result = chackrf.hackrf_open_on_android(hackrf_device_list[0][0], pyhackrf_device.get_hackrf_device_double_ptr())
789+
ELSE:
790+
result = chackrf.hackrf_open(pyhackrf_device.get_hackrf_device_double_ptr())
749791

750792
if result == chackrf.hackrf_error.HACKRF_SUCCESS:
751793
pyhackrf_device._setup_device()
@@ -758,7 +800,16 @@ def pyhackrf_open_by_serial(desired_serial_number: str) -> PyHackrfDevice | None
758800
return pyhackrf_open()
759801

760802
pyhackrf_device = PyHackrfDevice()
761-
result = chackrf.hackrf_open_by_serial(desired_serial_number.encode('utf-8'), pyhackrf_device.get_hackrf_device_double_ptr())
803+
IF ANDROID:
804+
result = chackrf.hackrf_error.HACKRF_ERROR_NOT_FOUND
805+
hackrf_device_list = get_hackrf_device_list()
806+
if len(hackrf_device_list):
807+
for file_descriptor, board_id, serial_number in hackrf_device_list:
808+
if serial_number == desired_serial_number:
809+
pyhackrf_device = PyHackrfDevice()
810+
result = chackrf.hackrf_open_on_android(file_descriptor, pyhackrf_device.get_hackrf_device_double_ptr())
811+
ELSE:
812+
result = chackrf.hackrf_open_by_serial(desired_serial_number.encode('utf-8'), pyhackrf_device.get_hackrf_device_double_ptr())
762813

763814
if result == chackrf.hackrf_error.HACKRF_SUCCESS:
764815
pyhackrf_device._setup_device()

0 commit comments

Comments
 (0)