r4922 - developers/werner/ahrt/host/tmc/lib
werner at docs.openmoko.org
werner at docs.openmoko.org
Fri Feb 13 03:40:35 CET 2009
Author: werner
Date: 2009-02-13 03:40:35 +0100 (Fri, 13 Feb 2009)
New Revision: 4922
Modified:
developers/werner/ahrt/host/tmc/lib/decode.py
developers/werner/ahrt/host/tmc/lib/dxplore.py
developers/werner/ahrt/host/tmc/lib/meter.py
Log:
- added experimental I2C decoding (note: dual-edged trigger is the wrong
approach. Should just give the decoder the raw bitstream and let it
figure out what makes sense as a trigger. That approach will also work
for protocols with a hidden timebase, such as RS-232.)
- basic access functions for multimeters. Work in progress.
Modified: developers/werner/ahrt/host/tmc/lib/decode.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/decode.py 2009-02-13 02:36:49 UTC (rev 4921)
+++ developers/werner/ahrt/host/tmc/lib/decode.py 2009-02-13 02:40:35 UTC (rev 4922)
@@ -568,6 +568,69 @@
return d_usb(inverted)
+def d_i2c_payload(bits):
+ if len(bits) < 7:
+ return d_byte_msb(bits)
+ s = "%02X" % d_msb(bits[0:7])
+ del bits[0:7]
+
+ if not len(bits):
+ return s
+ if bits[0] == "X":
+ s += "X"
+ else:
+ s += ("W", "R")[bits[0]]
+ del bits[0]
+
+ while len(bits):
+ if bits[0] == "X":
+ s += "X"
+ else:
+ s += ("", "N")[bits[0]]
+ del bits[0]
+
+ if len(bits) < 8:
+ return s+d_byte_msb(bits)
+ s += "."+d_byte_msb(bits[0:8])
+ del bits[0:8]
+
+ return s
+
+
+def d_i2c_sda(bits):
+ if not len(bits):
+ return ""
+ if bits[0]:
+ return "?"
+ del bits[0]
+
+ s = "S"
+ p = []
+ while len(bits) > 1:
+ if bits[0] == 1 and bits[1] == 0:
+ s += d_i2c_payload(p)+".Sr"
+ r = []
+ elif bits[0] == 0 and bits[1] == 1:
+ return s+d_i2c_payload(p)+".P"
+ else:
+ p.append(bits[0])
+ del bits[0:2]
+
+ if len(bits):
+ p.append(bits[0])
+ if len(p):
+ s += d_i2c_payload(p)
+ return s
+
+
+def d_i2c_scl(bits):
+ n = len(bits)
+ if n == 0:
+ return ""
+ else:
+ return str(n/2)
+
+
def d_set_table(table):
global d_table
@@ -576,12 +639,14 @@
decoders = [
# 0123456789abcdef -- maximum length is 16 characters
- ( "LSB->MSB", d_byte_lsb ),
- ( "MSB->LSB", d_byte_msb ),
- ( "SDIO CMD", d_sdio_cmd ),
- ( "SDIO RESP (SD)", d_sdio_resp_sd ),
- ( "SDIO RESP (SPI)", d_sdio_resp_spi ),
- ( "SDIO R5 (SPI)", d_sdio_r5_spi ),
- ( "USB D+", d_usb_dp ),
- ( "USB D-", d_usb_dm ),
+ ( "LSB->MSB", d_byte_lsb, False ),
+ ( "MSB->LSB", d_byte_msb, False ),
+ ( "SDIO CMD", d_sdio_cmd, False ),
+ ( "SDIO RESP (SD)", d_sdio_resp_sd, False ),
+ ( "SDIO RESP (SPI)", d_sdio_resp_spi, False ),
+ ( "SDIO R5 (SPI)", d_sdio_r5_spi, False ),
+ ( "USB D+", d_usb_dp, False ),
+ ( "USB D-", d_usb_dm, False ),
+ ( "I2C SDA", d_i2c_sda, False ),
+ ( "I2C SCL", d_i2c_scl, True ),
]
Modified: developers/werner/ahrt/host/tmc/lib/dxplore.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/dxplore.py 2009-02-13 02:36:49 UTC (rev 4921)
+++ developers/werner/ahrt/host/tmc/lib/dxplore.py 2009-02-13 02:40:35 UTC (rev 4922)
@@ -1,7 +1,7 @@
#
# dxplore.py - GUI for interactive exploration of digital waveforms
#
-# Copyright (C) 2008 by OpenMoko, Inc.
+# Copyright (C) 2008, 2009 by OpenMoko, Inc.
# Written by Werner Almesberger <werner at openmoko.org>
# All Rights Reserved
#
@@ -132,8 +132,9 @@
def deselect(self):
self.main.w.itemconfig(self.tag, fill = self.color_normal)
- def set_decoder(self, decoder):
+ def set_decoder(self, decoder, both_edges):
self.decoder = decoder
+ self.both_edges = both_edges
def begin_decode(self, pos):
x0 = self.x(pos)
@@ -492,12 +493,13 @@
# Brilliant hack. Found it described here:
# http://infohost.nmt.edu/tcc/help/pubs/tkinter/extra-args.html
- def handler(ch = ch, decoder = dec[1], button = mb, label = dec[0]):
- ch.set_decoder(decoder)
+ def handler(ch = ch, decoder = dec[1], both_edges = dec[2],
+ button = mb, label = dec[0]):
+ ch.set_decoder(decoder, both_edges)
button.config(text = label)
mb.menu.add_command(label = dec[0], command = handler)
- ch.set_decoder(decoders[0][1])
+ ch.set_decoder(decoders[0][1], decoders[0][2])
def move(self, event):
self.cur.move(event.x)
@@ -728,19 +730,20 @@
i = self.decode_from
while i <= self.cur.pos:
if self.selected.d[i-1] != self.selected.d[i] and \
- self.selected.d[i] == self.selected.d[self.decode_from]:
+ (self.selected.d[i] == self.selected.d[self.decode_from] or
+ self.selected.both_edges):
if ch.d[i-1] == ch.d[i]:
bits.append(ch.d[i])
else:
bits.append("X")
i += 1
by_ch[ch] = bits
- ch.pre_decode(ch is self.selected, bits)
+ ch.pre_decode(ch is self.selected and not ch.both_edges, bits)
d_set_table(d_table)
for ch in self.ch:
- ch.decode(ch is self.selected, by_ch[ch])
+ ch.decode(ch is self.selected and not ch.both_edges, by_ch[ch])
def end_decode(self):
for ch in self.ch:
Modified: developers/werner/ahrt/host/tmc/lib/meter.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/meter.py 2009-02-13 02:36:49 UTC (rev 4921)
+++ developers/werner/ahrt/host/tmc/lib/meter.py 2009-02-13 02:40:35 UTC (rev 4922)
@@ -1,7 +1,7 @@
#
# meter.py - Multimeter control
#
-# Copyright (C) 2008 by OpenMoko, Inc.
+# Copyright (C) 2008, 2009 by OpenMoko, Inc.
# Written by Werner Almesberger <werner at openmoko.org>
# All Rights Reserved
#
@@ -11,20 +11,64 @@
# (at your option) any later version.
#
+#
+# async:
+#
+# - setup measurement
+# - start capture
+# - notify(capture ends)/stop capture
+# - retrieve and process
+#
+# .start(samples = Null)
+# .wait -> return vector
+# .stop -> return vector
+#
+
from tmc.instrument import instrument, setting
class meter(instrument):
- # Warning: "meter" doesn't lock itself !
- pass
+ def __init__(self, *args):
+ # Warning: "meter" doesn't lock itself !
+ instrument.__init__(self, *args)
+ self.avg = setting(self, "CALC:FUNC AVER;:CALC:STAT",
+ lambda x: x == 1,
+ lambda x: ("OFF", "ON")[x != 0])
+ self.min = setting(self, "CALC:AVER:MIN",
+ lambda x: float(x), None)
+ self.max = setting(self, "CALC:AVER:MAX",
+ lambda x: float(x), None)
+ self.avg = setting(self, "CALC:AVER:AVER",
+ lambda x: float(x), None)
+ self.count = setting(self, "CALC:AVER:COUNT",
+ lambda x: int(x), None)
+ def sample(self):
+ return float(self.query("READ?"))
+
+ def average(self, n):
+ sum = 0
+ for i in range(0, n):
+ sum += self.sample()
+ return sum/n
+
+ def v(self):
+ self.send("CONF:VOLT:DC")
+
+ def i(self):
+ self.send("CONF:CURR:DC MAX")
+
+
class fluke_8845a(meter):
def __init__(self, name):
meter.__init__(self, "telnet", "tries=3", name)
self.lock_attr()
+# Reset often activates some relays, so we shouldn't use it carelessly.
+# self.send("*RST")
+ self.send(":SYST:REM")
class picotest_m3500a(meter):
More information about the commitlog
mailing list