Files
quisk/quisk_hardware_fifisdr.py
T

157 lines
5.8 KiB
Python

# This is the hardware file for the FiFiSDR radio. Thanks to Joe, LA6GRA.
#import sys, struct, time, traceback, math
import struct, traceback
from softrock import hardware_usb as SoftRock
GET_FIFI_EXTRA = 0xAB
SET_FIFI_EXTRA = 0xAC
EXTRA_READ_SVN_VERSION = 0
EXTRA_READ_FW_VERSION = 1
EXTRA_WRITE_PREAMP = 19
EXTRA_READ_PREAMP = 19
try:
import usb
import usb.core, usb.util
except:
if sys.platform == 'win32':
dlg = wx.MessageDialog(None, "The Python pyusb module is required but not installed. Do you want me to install it?",
"Install Python pyusb", style = wx.YES|wx.NO)
if dlg.ShowModal() == wx.ID_YES:
import subprocess
subprocess.call([sys.executable, "-m", "pip", "install", "pyusb"])
try:
import usb
import usb.core, usb.util
except:
dlg = wx.MessageDialog(None, "Installation of Python pyusb failed. Please install it by hand.",
"Installation failed", style=wx.OK)
dlg.ShowModal()
else:
dlg = wx.MessageDialog(None, "The Python pyusb module is required but not installed. Please install package python-usb.",
"Install Python pyusb", style = wx.OK)
dlg.ShowModal()
DEBUG = 1
IN = usb.util.build_request_type(usb.util.CTRL_IN, usb.util.CTRL_TYPE_VENDOR, usb.util.CTRL_RECIPIENT_DEVICE)
OUT = usb.util.build_request_type(usb.util.CTRL_OUT, usb.util.CTRL_TYPE_VENDOR, usb.util.CTRL_RECIPIENT_DEVICE)
UBYTE2 = struct.Struct('<H')
UBYTE4 = struct.Struct('<L') # Thanks to Sivan Toledo
class Hardware(SoftRock.Hardware):
def __init__(self, app, conf):
SoftRock.Hardware.__init__(self, app, conf)
self.rf_gain_labels = ("-6 dB", "0 dB")
def open(self): # Called once to open the Hardware
global usb
# find our device
usb_dev = usb.core.find(idVendor=self.conf.usb_vendor_id, idProduct=self.conf.usb_product_id)
if usb_dev is None:
text = 'USB device not found VendorID 0x%X ProductID 0x%X' % (
self.conf.usb_vendor_id, self.conf.usb_product_id)
else:
#try: # This exception occurs for the Peabody SDR. Thanks to ON7VQ for figuring out the problem,
#usb_dev.set_configuration() # and to David, AE9RB, for the fix.
#except:
#if DEBUG: traceback.print_exc()
try:
ret = usb_dev.ctrl_transfer(IN, 0x00, 0x0E00, 0, 2)
except:
if DEBUG: traceback.print_exc()
#text = "No permission to access the SoftRock USB interface"
text = "No permission to access the FiFi-SDR USB interface"
usb_dev = None
try: # Second try. Thanks to Ben Cahill.
if DEBUG: print("Second try to open USB with libusb0 backend.")
import usb.backend.libusb0
backend = usb.backend.libusb0.get_backend()
usb_dev = usb.core.find(idVendor=self.conf.usb_vendor_id, idProduct=self.conf.usb_product_id, backend=backend)
try:
usb_dev.set_configuration()
except:
if DEBUG: traceback.print_exc()
try:
ret = usb_dev.ctrl_transfer(IN, 0x00, 0x0E00, 0, 2)
except:
if DEBUG: traceback.print_exc()
usb_dev = None
except:
usb_dev = None
if usb_dev is not None:
self.usb_dev = usb_dev # success
if len(ret) == 2:
ver = "%d.%d" % (ret[1], ret[0])
else:
ver = 'unknown'
sound = self.conf.name_of_sound_capt
if DEBUG:
print("Sound = %s" % (sound))
if len(sound) > 50:
sound = sound[0:30] + '|||' + sound[-17:]
if DEBUG:
print("Sound = %s" % (sound))
try:
#res = self.handle.controlMsg(requestType = DEVICE2HOST,
#request = GET_FIFI_EXTRA,
#buffer = 4,
#value=0,
#index=EXTRA_READ_SVN_VERSION,
#timeout=100)
res = self.usb_dev.ctrl_transfer(IN, GET_FIFI_EXTRA, 0, EXTRA_READ_SVN_VERSION, 4)
except:
if DEBUG:
traceback.print_exc()
svn = (((((res[3]<<8) + res[2])<<8) + res[1])<<8) + res[0]
if DEBUG:
print ("FiFi_SVN = %d" % svn)
try:
res = self.usb_dev.ctrl_transfer(IN, GET_FIFI_EXTRA, 0, EXTRA_READ_FW_VERSION, 20)
except:
if DEBUG:
traceback.print_exc()
fifi_ver = res
if DEBUG:
print ("FiFi_ver = %s" % res)
#fifi_ver_str = ''.join([chr(i) for i in res]) # får ikkje med null terminering
fifi_ver_str = ''
for i in fifi_ver:
if not i:
break
fifi_ver_str += chr(i)
print ("FiFi_ver = %s" % fifi_ver_str)
#text = 'Capture from SoftRock USB on %s, Firmware %s' % (sound, ver)
text = "Capture from FiFi-SDR USB (%d, %s), on %s, (SR ver. %s)" % (svn, fifi_ver_str, sound, ver)
if DEBUG:
print ('Quisk_title_line = "%s"' % text)
#self.application.bottom_widgets.info_text.SetLabel(text)
if DEBUG and usb_dev:
print ('Startup freq', self.GetStartupFreq())
print ('Run freq', self.GetFreq())
print ('Address 0x%X' % usb_dev.ctrl_transfer(IN, 0x41, 0, 0, 1)[0])
sm = usb_dev.ctrl_transfer(IN, 0x3B, 0, 0, 2)
sm = UBYTE2.unpack(sm)[0]
print ('Smooth tune', sm)
return text
def OnButtonRfGain(self, event):
btn = event.GetEventObject()
value = btn.index
# value == 0: -6dB
# value == 1: 0dB
msg = bytearray()
msg.append(value)
self.usb_dev.ctrl_transfer(OUT, SET_FIFI_EXTRA, self.si570_i2c_address + 0x700, EXTRA_WRITE_PREAMP, msg)