quisk-kc4upr/quisk_conf_openradio.py

123 lines
3.8 KiB
Python
Executable File

# OpenRadio v1.1 Quisk Configuration File
#
# IMPORTANT: To be able to control the OpenRadio board from within Quisk,
# you will need to compile and upload the 'openradio_quisk' firmware, which
# is available from: https://github.com/darksidelemm/open_radio_miniconf_2015
#
# You will also need to install the pyserial package for python.
#
from __future__ import print_function
from __future__ import absolute_import
from __future__ import division
# SOUND CARD SETTINGS
#
# Uncomment these if you wish to use PortAudio directly
#name_of_sound_capt = "portaudio:(hw:2,0)"
#name_of_sound_play = "portaudio:(hw:1,0)"
# Uncomment these lines if you wish to use Pulseaudio
name_of_sound_capt = "pulse"
name_of_sound_play = "pulse"
# SERIAL PORT SETTINGS
# Set this as appropriate for your OS.
openradio_serial_port = "/dev/ttyUSB0"
openradio_serial_rate = 57600
# OpenRadio Frequency limits.
# These are just within the limits set in the openradio_quisk firmware.
openradio_lower = 100001
openradio_upper = 29999999
# OpenRadio Hardware Control Class
#
import serial,time
from quisk_hardware_model import Hardware as BaseHardware
class Hardware(BaseHardware):
def open(self):
# Called once to open the Hardware
# Open the serial port.
self.or_serial = serial.Serial(openradio_serial_port,openradio_serial_rate,timeout=3)
print("Opened Serial Port.")
# Wait for the Arduino Nano to restart and boot.
time.sleep(2)
# Poll for version. Should probably confirm the response on this.
version = str(self.get_parameter("VER"))
print(version)
# Return an informative message for the config screen
t = version + ". Capture from sound card %s." % self.conf.name_of_sound_capt
return t
def close(self):
# Called once to close the Hardware
self.or_serial.close()
def ChangeFrequency(self, tune, vfo, source='', band='', event=None):
# Called whenever quisk requests a frequency change.
# This sends the FREQ command to set the centre frequency of the OpenRadio,
# and will also move the 'tune' frequency (the section within the RX passband
# which is to be demodulated) if it falls outside the passband (+/- sample_rate/2).
print("Setting VFO to %d." % vfo)
if(vfo<openradio_lower):
vfo = openradio_lower
print("Outside range! Setting to %d" % openradio_lower)
if(vfo>openradio_upper):
vfo = openradio_upper
print("Outside range! Setting to %d" % openradio_upper)
success = self.set_parameter("FREQ",str(vfo))
# If the tune frequency is outside the RX bandwidth, set it to somewhere within that bandwidth.
if(tune>(vfo + sample_rate/2) or tune<(vfo - sample_rate/2)):
tune = vfo + 10000
print("Bringing tune frequency back into the RX bandwidth.")
if success:
print("Frequency change succeeded!")
else:
print("Frequency change failed.")
return tune, vfo
#
# Serial comms functions, to communicate with the OpenRadio board
#
def get_parameter(self,string):
self.or_serial.write(string+"\n")
return self.get_argument()
def set_parameter(self,string,arg):
self.or_serial.write(string+","+arg+"\n")
if self.get_argument() == arg:
return True
else:
return False
def get_argument(self):
data1 = self.or_serial.readline()
# Do a couple of quick checks to see if there is useful data here
if len(data1) == 0:
return -1
# Maybe we didn't catch an OK line?
if data1.startswith('OK'):
data1 = self.or_serial.readline()
# Check to see if we have a comma in the string. If not, there is no argument.
if data1.find(',') == -1:
return -1
data1 = data1.split(',')[1].rstrip('\r\n')
# Check for the OK string
data2 = self.or_serial.readline()
if data2.startswith('OK'):
return data1