From 72620b4bfd3cec4bd7835384e4bfb5b7cbfe2c3a Mon Sep 17 00:00:00 2001 From: gjones Date: Wed, 26 Jun 2013 16:51:23 -0400 Subject: [PATCH 1/2] Add try finally clauses to be sure connection gets closed if there's a failure Add timeout parameter Add a few convenience functions to avoid dealing with SYNTH_A,SYNTH_B constants --- src/valon_synth.py | 215 +++++++++++++++++++++++++++++++-------------- 1 file changed, 151 insertions(+), 64 deletions(-) diff --git a/src/valon_synth.py b/src/valon_synth.py index c63a29f..33f5856 100644 --- a/src/valon_synth.py +++ b/src/valon_synth.py @@ -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) @@ -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 @@ -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 @@ -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 @@ -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): """ @@ -223,9 +262,13 @@ 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 @@ -233,12 +276,20 @@ def set_rf_level(self, synth, rf_level): 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: @@ -256,10 +307,12 @@ 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) @@ -267,6 +320,12 @@ def get_options(self, synth): 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): """ @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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): """ @@ -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): """ @@ -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 @@ -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 From 186aa07038041136580a21387f02001c07d3359f Mon Sep 17 00:00:00 2001 From: gjones Date: Wed, 26 Jun 2013 17:18:43 -0400 Subject: [PATCH 2/2] add __version__ attribute to find out if correct version is installed --- src/valon_synth.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/valon_synth.py b/src/valon_synth.py index 33f5856..abb827b 100644 --- a/src/valon_synth.py +++ b/src/valon_synth.py @@ -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"