@@ -31,6 +31,10 @@ from . cimport chackrf
3131import numpy as np
3232cimport cython
3333
34+ DEF ANDROID = False
35+ IF ANDROID:
36+ from .__android import get_hackrf_device_list
37+
3438
3539cdef 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
226257cdef class PyHackrfDevice:
227258
@@ -709,7 +740,10 @@ cdef class PyHackrfDevice:
709740
710741# ---- initialization and exit ---- #
711742def 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
735769def 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
745782def 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