Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
219 changes: 153 additions & 66 deletions src/valon_synth.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@

__author__ = "Patrick Brandt"
__copyright__ = "Copyright 2011, Associated Universities, Inc."
__credits__ = ["Patrick Brandt, Stewart Rumley, Steven Stark"]
__credits__ = ["Patrick Brandt, Stewart Rumley, Steven Stark, Glenn Jones"]
__license__ = "GPL"
#__version__ = "1.0"
__version__ = "1.0"
__maintainer__ = "Patrick Brandt"


Expand All @@ -49,10 +49,11 @@
NACK = 0x15

class Synthesizer:
def __init__(self, port):
def __init__(self, port,timeout=1.0):
self.conn = serial.Serial(None, 9600, serial.EIGHTBITS,
serial.PARITY_NONE, serial.STOPBITS_ONE)
self.conn.setPort(port)
self.conn.setTimeout(timeout)

def _generate_checksum(self, bytes):
return chr(sum([ord(b) for b in bytes]) % 256)
Expand Down Expand Up @@ -92,14 +93,25 @@ def get_frequency(self, synth):
self.conn.open()
bytes = struct.pack('>B', 0x80 | synth)
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
self.conn.close()
try:
bytes = self.conn.read(24)
checksum = self.conn.read(1)
finally:
self.conn.close()
#self._verify_checksum(bytes, checksum)
ncount, frac, mod, dbf = self._unpack_freq_registers(bytes)
EPDF = self._getEPDF(synth)
return (ncount + float(frac) / mod) * EPDF / dbf

def get_frequency_a(self):
return self.get_frequency(SYNTH_A)

def get_frequency_b(self):
return self.get_frequency(SYNTH_B)

def get_frequencies(self):
return self.get_frequency_a(),self.get_frequency_b()

def set_frequency(self, synth, freq, chan_spacing = 10.):
"""
Sets the synthesizer to the desired frequency
Expand Down Expand Up @@ -139,29 +151,43 @@ def set_frequency(self, synth, freq, chan_spacing = 10.):
self.conn.open()
bytes = struct.pack('>B', 0x80 | synth)
self.conn.write(bytes)
old_bytes = self.conn.read(24)
checksum = self.conn.read(1)
try:
old_bytes = self.conn.read(24)
checksum = self.conn.read(1)
except Exception, e:
self.conn.close()
raise e
#self._verify_checksum(old_bytes, checksum)
bytes = struct.pack('>B24s', 0x00 | synth,
self._pack_freq_registers(ncount, frac, mod,
dbf, old_bytes))
checksum = self._generate_checksum(bytes)
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
finally:
self.conn.close()
ack = struct.unpack('>B', bytes)[0]
return ack == ACK

def set_frequency_a(self, freq, chan_spacing = 10.):
return self.set_frequency(SYNTH_A, freq, chan_spacing=chan_spacing)

def set_frequency_b(self, freq, chan_spacing = 10.):
return self.set_frequency(SYNTH_B, freq, chan_spacing=chan_spacing)

def get_reference(self):
"""
Get reference frequency in MHz
"""
self.conn.open()
bytes = struct.pack('>B', 0x81)
self.conn.write(bytes)
bytes = self.conn.read(4)
checksum = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes)
bytes = self.conn.read(4)
checksum = self.conn.read(1)
finally:
self.conn.close()
#self._verify_checksum(bytes, checksum)
freq = struct.unpack('>I', bytes)[0]
return freq
Expand All @@ -178,9 +204,11 @@ def set_reference(self, freq):
self.conn.open()
bytes = struct.pack('>BI', 0x01, freq)
checksum = self._generate_checksum(bytes)
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
finally:
self.conn.close()
ack = struct.unpack('>B', bytes)[0]
return ack == ACK

Expand All @@ -196,15 +224,26 @@ def get_rf_level(self, synth):
rfl_table = {0: -4, 1: -1, 2: 2, 3: 5}
self.conn.open()
bytes = struct.pack('>B', 0x80 | synth)
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
finally:
self.conn.close()
#self._verify_checksum(bytes, checksum)
reg0, reg1, reg2, reg3, reg4, reg5 = struct.unpack('>IIIIII', bytes)
rfl = (reg4 >> 3) & 0x03
rf_level = rfl_table.get(rfl)
return rf_level

def get_rf_level_a(self):
return self.get_rf_level(SYNTH_A)

def get_rf_level_b(self):
return self.get_rf_level(SYNTH_B)

def get_rf_levels(self):
return self.get_rf_level_a(),self.get_rf_level_b()

def set_rf_level(self, synth, rf_level):
"""
Expand All @@ -223,22 +262,34 @@ def set_rf_level(self, synth, rf_level):
if(rfl is None): return False
self.conn.open()
bytes = struct.pack('>B', 0x80 | synth)
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
try:
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
except Exception, e:
self.conn.close()
raise e
#self._verify_checksum(bytes, checksum)
reg0, reg1, reg2, reg3, reg4, reg5 = struct.unpack('>IIIIII', bytes)
reg4 &= 0xffffffe7
reg4 |= (rfl & 0x03) << 3
bytes = struct.pack('>BIIIIII', 0x00 | synth,
reg0, reg1, reg2, reg3, reg4, reg5)
checksum = self._generate_checksum(bytes)
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
finally:
self.conn.close()
ack = struct.unpack('>B', bytes)[0]
return ack == ACK

def set_rf_level_a(self,rf_level):
return set_rf_level(SYNTH_A,rf_level)

def set_rf_level_b(self,rf_level):
return set_rf_level(SYNTH_B,rf_level)

def get_options(self, synth):
"""
Get options tuple:
Expand All @@ -256,17 +307,25 @@ def get_options(self, synth):
"""
self.conn.open()
bytes = struct.pack('>B', 0x80 | synth)
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
finally:
self.conn.close()
#self._verify_checksum(bytes, checksum)
reg0, reg1, reg2, reg3, reg4, reg5 = struct.unpack('>IIIIII', bytes)
low_spur = ((reg2 >> 30) & 1) & ((reg2 >> 29) & 1)
double = (reg2 >> 25) & 1
half = (reg2 >> 24) & 1
r = (reg2 >> 14) & 0x03ff
return double, half, r, low_spur

def get_options_a(self):
return get_options(SYNTH_A)

def get_options_b(self):
return get_options(SYNTH_B)

def set_options(self, synth, double = 0, half = 0, r = 1, low_spur = 0):
"""
Expand Down Expand Up @@ -294,9 +353,13 @@ def set_options(self, synth, double = 0, half = 0, r = 1, low_spur = 0):
"""
self.conn.open()
bytes = struct.pack('>B', 0x80 | synth)
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
try:
self.conn.write(bytes)
bytes = self.conn.read(24)
checksum = self.conn.read(1)
except Exception, e:
self.conn.close()
raise e
#self._verify_checksum(bytes, checksum)
reg0, reg1, reg2, reg3, reg4, reg5 = struct.unpack('>IIIIII', bytes)
reg2 &= 0x9c003fff
Expand All @@ -306,9 +369,11 @@ def set_options(self, synth, double = 0, half = 0, r = 1, low_spur = 0):
bytes = struct.pack('>BIIIIII', 0x00 | synth,
reg0, reg1, reg2, reg3, reg4, reg5)
checksum = self._generate_checksum(bytes)
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
finally:
self.conn.close()
ack = struct.unpack('>B', bytes)[0]
return ack == ACK

Expand All @@ -319,10 +384,12 @@ def get_ref_select(self):
"""
self.conn.open()
bytes = struct.pack('>B', 0x86)
self.conn.write(bytes)
bytes = self.conn.read(1)
checksum = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes)
bytes = self.conn.read(1)
checksum = self.conn.read(1)
finally:
self.conn.close()
#self._verify_checksum(bytes, checksum)
is_ext = struct.unpack('>B', bytes)[0]
return is_ext & 1
Expand All @@ -339,9 +406,11 @@ def set_ref_select(self, e_not_i = 1):
self.conn.open()
bytes = struct.pack('>BB', 0x06, e_not_i & 1)
checksum = self._generate_checksum(bytes)
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
finally:
self.conn.close()
ack = struct.unpack('>B', bytes)[0]
return ack == ACK

Expand All @@ -356,10 +425,12 @@ def get_vco_range(self, synth):
"""
self.conn.open()
bytes = struct.pack('>B', 0x83 | synth)
self.conn.write(bytes)
bytes = self.conn.read(4)
checksum = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes)
bytes = self.conn.read(4)
checksum = self.conn.read(1)
finally:
self.conn.close()
#self._verify_checksum(bytes, checksum)
min, max = struct.unpack('>HH', bytes)
return min, max
Expand All @@ -382,9 +453,11 @@ def set_vco_range(self, synth, min, max):
self.conn.open()
bytes = struct.pack('>BHH', 0x03 | synth, min, max)
checksum = self._generate_checksum(bytes)
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
finally:
self.conn.close()
ack = struct.unpack('>B', bytes)[0]
return ack == ACK

Expand All @@ -399,14 +472,19 @@ def get_phase_lock(self, synth):
"""
self.conn.open()
bytes = struct.pack('>B', 0x86 | synth)
self.conn.write(bytes)
bytes = self.conn.read(1)
checksum = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes)
bytes = self.conn.read(1)
checksum = self.conn.read(1)
finally:
self.conn.close()
#self._verify_checksum(bytes, checksum)
mask = (synth << 1) or 0x20
lock = struct.unpack('>B', bytes)[0] & mask
return lock > 0

def get_phase_locks(self):
return self.get_phase_lock(SYNTH_A),self.get_phase_lock(SYNTH_B)

def get_label(self, synth):
"""
Expand All @@ -419,12 +497,17 @@ def get_label(self, synth):
"""
self.conn.open()
bytes = struct.pack('>B', 0x82 | synth)
self.conn.write(bytes)
bytes = self.conn.read(16)
checksum = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes)
bytes = self.conn.read(16)
checksum = self.conn.read(1)
finally:
self.conn.close()
#self._verify_checksum(bytes, checksum)
return bytes

def get_labels(self):
return self.get_label(SYNTH_A),self.get_label(SYNTH_B)

def set_label(self, synth, label):
"""
Expand All @@ -441,9 +524,11 @@ def set_label(self, synth, label):
self.conn.open()
bytes = struct.pack('>B16s', 0x02 | synth, label)
checksum = self._generate_checksum(bytes)
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
finally:
self.conn.close()
ack = struct.unpack('>B', bytes)[0]
return ack == ACK

Expand All @@ -456,9 +541,11 @@ def flash(self):
self.conn.open()
bytes = struct.pack('>B', 0x40)
checksum = self._generate_checksum(bytes)
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
self.conn.close()
try:
self.conn.write(bytes + checksum)
bytes = self.conn.read(1)
finally:
self.conn.close()
ack = struct.unpack('>B', bytes)[0]
return ack == ACK

Expand Down