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