-
Notifications
You must be signed in to change notification settings - Fork 6
/
quisk_hardware_fifisdr.py
156 lines (138 loc) · 5.83 KB
/
quisk_hardware_fifisdr.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# 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)