r4601 - in developers/werner/ahrt/host/tmc: . lib

werner at docs.openmoko.org werner at docs.openmoko.org
Thu Aug 21 09:48:12 CEST 2008


Author: werner
Date: 2008-08-21 09:48:11 +0200 (Thu, 21 Aug 2008)
New Revision: 4601

Added:
   developers/werner/ahrt/host/tmc/lib/
   developers/werner/ahrt/host/tmc/lib/function.py
   developers/werner/ahrt/host/tmc/lib/instrument.py
   developers/werner/ahrt/host/tmc/lib/meter.py
   developers/werner/ahrt/host/tmc/lib/power.py
   developers/werner/ahrt/host/tmc/lib/scope.py
   developers/werner/ahrt/host/tmc/lib/trigger.py
   developers/werner/ahrt/host/tmc/lib/wave.py
Modified:
   developers/werner/ahrt/host/tmc/telnet.c
   developers/werner/ahrt/host/tmc/usbtmc.c
Log:
Committing changes that have piled up. The things under lib/ are ugly,
incomplete, and buggy. Don't try to use them yet.

- usbtmc.c: improper handling of the "vendor=" option
- telnet.c: added option "nl" to suppress warning on extra newline (note that
  this makes parameter parsing ambiguous - to be fixed later)
- lib/: added a number of Python scripts to implement properly abstracted 
  access to instruments (work in progress, still very limited)



Added: developers/werner/ahrt/host/tmc/lib/function.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/function.py	                        (rev 0)
+++ developers/werner/ahrt/host/tmc/lib/function.py	2008-08-21 07:48:11 UTC (rev 4601)
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+#
+# function.py
+#
+
+
+import instrument
+from instrument import setting
+
+
+class function(instrument.instrument):
+    pass
+
+
+class picotest_g5100a(function):
+
+    def __init__(self, name = None):
+	if name is None:
+	    function.__init__(self, "usbtmc", "timeout=2", "retry",
+	      "vendor=0x164e", "product=0x13ec")
+	else:
+	    function.__init__(self, "telnet", "tries=3", "nl", name, "5025")
+
+    def read(self):
+	return function.read(self).rstrip('\n')


Property changes on: developers/werner/ahrt/host/tmc/lib/function.py
___________________________________________________________________
Name: svn:executable
   + *

Added: developers/werner/ahrt/host/tmc/lib/instrument.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/instrument.py	                        (rev 0)
+++ developers/werner/ahrt/host/tmc/lib/instrument.py	2008-08-21 07:48:11 UTC (rev 4601)
@@ -0,0 +1,103 @@
+#
+# instrument.py
+#
+
+#
+# Special thanks to Guillaume "Charlie" Chereau for his assistance with the
+# get/set functionality.
+#
+
+import tmc
+
+
+class setting(object):
+
+    def __init__(self, instr, path, in_convert = None, out_convert = None,
+      args = "", get_cmd = None, set_cmd = None):
+	self.value = None
+	self.instr = instr 
+	self.path = path
+	self.in_convert = in_convert
+	self.out_convert = out_convert 
+	self.args = args 
+	self.get_cmd = get_cmd
+	self.set_cmd = set_cmd
+
+    def get(self):
+	if self.value is None:
+	    self.value = self.instr.query(
+	      (self.get_cmd, str(self.path)+"?")[self.get_cmd is None]+
+	      (" "+self.args, "")[self.args == ""])
+	    if self.in_convert is not None:
+		self.value = self.in_convert(self.value)
+	return self.value
+
+    def set(self, value):
+	if self.path is None and self.set_cmd is None:
+	    raise hell
+	if value is None:
+	    self.value = None
+	elif value != self.value:
+	    if self.out_convert:
+		value = self.out_convert(value)
+		if value is None:
+		    raise hell
+	    self.instr.send((self.set_cmd, self.path)[self.set_cmd is None]+
+	      " "+self.args+str(value))
+	    self.value = value
+
+
+class settable(object):
+
+    def set(self, **list):
+	for key in list.keys():
+	    self.__setattr__(key, list[key])
+
+    def __getattribute__(self, name):
+	ret = super(settable, self).__getattribute__(name)
+	if isinstance(ret, setting):
+	    return ret.get()
+	return ret
+
+    def __setattr__(self, name, value):
+	attr = self.__dict__.get(name)
+	if isinstance(attr, setting):
+	    return attr.set(value)
+	return super(settable, self).__setattr__(name, value)
+
+
+#
+# For some reason, we can't subclass tmc.Instr, so we just redefine the few
+# methods is has. @@@FIXME
+#
+
+class instrument(settable):
+
+    def __init__(self, *args):
+	self.__tmc = tmc.Instr(*args)
+
+    def send(self, s):
+	print "SEND", s
+	self.__tmc.send(s)
+
+    def read(self):
+	res = self.__tmc.read()
+	if len(res) < 100:
+	    print "RECV", res
+	return res
+
+    def start(self, file, command = None):
+	if comand is None:
+	    self.__tmc_start(file)
+	else:
+	    self.__tmc_start(file, command)
+
+    def stop(self):
+	self.__tmc.stop()
+
+    def query(self, s):
+	self.send(s)
+	return self.read()
+
+    def identify(self):
+	return self.query("*IDN?")


Property changes on: developers/werner/ahrt/host/tmc/lib/instrument.py
___________________________________________________________________
Name: svn:executable
   + *

Added: developers/werner/ahrt/host/tmc/lib/meter.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/meter.py	                        (rev 0)
+++ developers/werner/ahrt/host/tmc/lib/meter.py	2008-08-21 07:48:11 UTC (rev 4601)
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+#
+# meter.py
+#
+
+
+import instrument
+from instrument import setting
+
+
+class meter(instrument.instrument):
+    pass
+
+
+class fluke_8845a(meter):
+
+    def __init__(self, name):
+	meter.__init__(self, "telnet", "tries=3", name)
+
+
+class picotest_m3500a(meter):
+
+    def __init__(self):
+	meter.__init__(self, "usbtmc", "timeout=2", "retry", "vendor=0x164e",
+	  "product=0x0dad")


Property changes on: developers/werner/ahrt/host/tmc/lib/meter.py
___________________________________________________________________
Name: svn:executable
   + *

Added: developers/werner/ahrt/host/tmc/lib/power.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/power.py	                        (rev 0)
+++ developers/werner/ahrt/host/tmc/lib/power.py	2008-08-21 07:48:11 UTC (rev 4601)
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+#
+# power.py
+#
+
+
+#
+# TODO:
+#
+#
+
+import instrument
+from instrument import settable, setting
+
+class power(instrument.instrument):
+	pass
+
+
+#
+# The mPP-3040D speaks a rather strange dialect of SCPI.
+#
+
+
+def float_or_none(value):
+    try:
+	return float(value)
+    except:
+	return None
+
+
+class leaptronix_mpp3040d(power):
+
+    mode_map = {
+      "CV - Constant Voltage." : "CV",
+      "CC - Constant Current!" : "CC" }
+
+    def __init__(self, device):
+	power.__init__(self, "tty", "bps=9600", "no_dci", device)
+
+	self.on = setting(self, ":OUTPUT",
+	  lambda on: on == "ON",
+	  lambda on: ("OFF", "ON")[on])
+
+	self.v_max = setting(self, ":VSET",
+	  lambda v: float(v.rstrip("V")),
+	  args = "#1 ")
+
+	self.i_max = setting(self, ":ISET",
+	  lambda i: float(i.rstrip("A")),
+	  args = "#1 ")
+
+	self.v = setting(self, ":VOUT",
+	  lambda v: float_or_none(v.rstrip("V")),
+	  args = "#1 ")
+
+	self.i = setting(self, ":IOUT",
+	  lambda i: float_or_none(i.rstrip("A")),
+	  args = "#1 ")
+
+	self.mode = setting(self, ":SYS:STATUS",
+	  lambda s: self.mode_map.get(s, None))
+
+    def send(self, s):
+	power.send(self, s)
+	last_read = power.read(self)
+
+    def read(self):
+	return self.last_read
+
+    def query(self, s):
+	print "query ", s
+	power.send(self, s)
+	return power.read(self)


Property changes on: developers/werner/ahrt/host/tmc/lib/power.py
___________________________________________________________________
Name: svn:executable
   + *

Added: developers/werner/ahrt/host/tmc/lib/scope.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/scope.py	                        (rev 0)
+++ developers/werner/ahrt/host/tmc/lib/scope.py	2008-08-21 07:48:11 UTC (rev 4601)
@@ -0,0 +1,275 @@
+#!/usr/bin/python
+#
+# scope.py - Oscilloscope control
+# 
+
+#
+# Our oscilloscope model consists of three elements:
+#
+# - one or more channels (vertical systems)
+# - one horizontal system (the time base)
+# - triggers
+#
+
+import time, instrument
+from instrument import setting, settable
+from wave import analog_wave, digital_wave
+
+
+# horizontal system only accepts some frequencies
+# TODO: make range configurable
+
+def scale_125(n, fuzz):
+    for e in range(-9, 1+1):
+	for m in [1, 2, 5]:
+	    if e < 0:
+		s = "0."+"0"*(-e-1)+str(m)
+	    else:
+		s = str(m)+"0"*e
+	    r = float(s)
+	    if r >= n*(1-fuzz) and r <= n*(1+fuzz):
+		return s
+
+
+# TODO: figure out what to do with signals. should they be objects in their
+# own right ?
+
+class signal(object):
+	# coupling, probe, filter, range
+
+    def pos(self, value):
+	pass
+
+    def scale(self, value):
+	pass
+
+    def range(self, low, high, divs):
+	self.pos((high+low)/2.0)
+	self.scale((high-low)/divs)
+
+
+# === channel =================================================================
+#
+# A channel is a vertical system of a scope. A scope can have any number of
+# channels. Channel settings determine which part of the signal voltage is
+# captured and at what bandwidth. Channels return the waveform captured.
+#
+
+class channel(settable):
+
+    def __init__(self, scope, number):
+
+	self.scope = scope
+	self.number = number
+
+	self.on = setting(scope, ":CHAN"+str(number)+":DISP",
+	  lambda on: on == "ON",
+	  lambda on: ("OFF", "ON")[on])
+
+	self.pos = setting(scope, ":CHAN"+str(number)+":OFFS",
+	  lambda pos: -float(pos),
+	  lambda pos: -pos)
+
+	self.scale = setting(scope, ":CHAN"+str(number)+":SCAL",
+	  lambda x: float(x))
+
+	self.coupling = setting(scope, "???")
+
+	self.probe = setting(scope, ":CHAN"+str(number)+":PROB",
+	  out_convert = self.scope.probe_translate)
+
+	self.bwlimit = setting(scope, ":CHAN"+str(self.number)+":BWL",
+	  out_convert = self.scope.bwlimit_translate)
+
+	self.forget()
+
+    def forget(self):
+	self.on = None
+	self.pos = None
+	self.scale = None
+	self.coupling = None
+	self.probe = None
+	self.bwlimit = None
+
+
+    # --- wave download -------------------------------------------------------
+
+
+    def wave(self, start = None, end = None, step = None):
+	return self.scope.download_wave(self, start, end, step)
+
+
+# === horizontal ==============================================================
+
+
+class horizontal(settable):
+
+    def __init__(self, scope):
+	self.scope = scope
+	self.pos = setting(scope, ":TIM:OFFS",
+	  lambda x: float(x))
+	self.scale = setting(scope, ":TIM:SCAL",
+	  lambda x: float(x))
+	self.forget()
+
+    def forget(self):
+	self.pos = None
+	self.scale = None
+
+
+# === trigger =================================================================
+
+
+class trigger(settable):
+
+    def __init__(self, scope):
+	self.scope = scope
+	#self.forget()
+
+    def forget(self):
+	self.mode.forget()
+	self.source.forget()
+	self.type.forget()
+	self.level.forget()
+	self.holdoff.forget()
+
+    def mode(self, value):
+	if value != None:
+	    if  value != self.mode:
+		self.scope.send(":TRIG"+str(self.number)+":SCAL "+str(value))
+		self.scale = value
+	else:
+	    pass
+	return self.scale
+
+    def source(self, value):
+	if value != None:
+	    if  value != self.scale:
+		self.scope.send(":CHAN"+str(self.number)+":SCAL "+str(value))
+		self.scale = value
+	else:
+	    self.scale =  self.scope.query(":CHAN"+str(self.number)+":SCAL?")
+	return self.scale
+
+    def sweep(self, value):
+	if value != None:
+	    if  value != self.sweep:
+		self.scope.send(":CHAN"+self.mode+":SWE "+str(value))
+		self.sweep = value
+	else:
+	    self.sweep = self.scope.query(":CHAN"+self.mode+":SWE?")
+	return self.sweep
+
+    def level(self, value):
+	if value != None:
+	    if  value != self.level:
+		self.scope.send(":TRIG:"+self.mode+":LEV "+str(value))
+		self.scale = level 
+	else:
+	    self.level =  self.scope.query(":TRIG:"+self.mode+":LEV?")
+	return self.leve
+
+    def holdoff(self, value):
+	if value != None:
+	    if  value != self.scale:
+		self.scope.send(":CHAN"+str(self.number)+":SCAL "+str(value))
+		self.scale = value
+	else:
+	    self.scale =  self.scope.query(":CHAN"+str(self.number)+":SCAL?")
+	return self.scale
+
+    def force(self):
+	self.scope.send(":FORC")
+
+    def state(self):
+	return self.scope.query(":TRIG:STAT?")
+
+
+# ====
+
+class scope(instrument.instrument):
+    pass
+
+
+# === Rigol DS1000C scope =====================================================
+
+
+def rigol_channel_data(s, t0, td, v0, vd):
+    res = analog_wave()
+    i = 202
+    while i != 800:
+	div = (i-502)/50.0
+	t = t0+div*td
+	div = (125-ord(s[i]))/25.0
+	v = v0+div*vd
+	res.append(t, v)
+	i += 1
+    return res
+
+
+def rigol_la_data(s, t0, td):
+    res = []
+    for b in range(0, 16):
+	res.append(digital_wave())
+    i = 412 
+    while i != 1612:
+	div = (i-1012)/100.0
+	t = t0+div*td
+	for b in range(0, 8):
+	    res[b].append(t, (ord(s[i]) & (1 << b)) != 0)
+	    res[b+8].append(t, (ord(s[i+1]) & (1 << b)) != 0)
+	i += 2
+    return res
+
+
+class rigol_ds1000c(scope):
+    channels = 2
+    div_hor = 12
+    div_vert = 10
+
+    def __init__(self):
+	scope.__init__(self, "usbtmc", "rigol", "timeout=2", "retry",
+          "vendor=0x0400", "product=0x05dc")
+	self.ch = []
+	for n in range(1, self.channels+1):
+	    self.ch.append(channel(self, n))
+	self.hor = horizontal(self)
+	self.trigger = trigger(self)
+
+    def forget(self):
+	for ch in self.ch:
+	    ch.forget()
+	self.hor.forget()
+	self.trigger.forget()
+
+    def send(self, s):
+	scope.send(self, s)
+	time.sleep(0.1)
+
+    # --- functions below are for internal use --------------------------------
+
+    def probe_translate(self, probe):
+	return { 1:"1X", 10:"10X", 100:"100X", 1000:"1000X" }[probe]
+
+    def bwlimit_translate(self, limit):
+	return ("OFF", "ON")[limit <= 20*1.01]
+
+    def trigger_source_translate(self, source):
+	source = source.upper()
+	if source == "CH1":
+	    pass
+
+    def download_wave(self, channel, start, end, step):
+	c_num = None
+	for n in range(0, len(self.ch)):
+	    if self.ch[n] == channel:
+		c_num = n+1
+	data = self.query(":WAV:DATA? CHAN"+str(c_num))
+	return rigol_channel_data(data, self.hor.pos, self.hor.scale,
+	   channel.pos, channel.scale)
+
+    # experimental
+
+    def download_la(self):
+	data = self.query(":WAV:DATA? DIG")
+	return rigol_la_data(data, self.hor.pos, self.hor.scale)


Property changes on: developers/werner/ahrt/host/tmc/lib/scope.py
___________________________________________________________________
Name: svn:executable
   + *

Added: developers/werner/ahrt/host/tmc/lib/trigger.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/trigger.py	                        (rev 0)
+++ developers/werner/ahrt/host/tmc/lib/trigger.py	2008-08-21 07:48:11 UTC (rev 4601)
@@ -0,0 +1,61 @@
+#
+# @@@ old-style. needs rewriting.
+#
+
+class trigger(object):
+
+    def __init__(self, scope):
+	self.scope = scope
+	self.forget()
+
+    def forget(self):
+	mode = None
+	source = None
+	type = None
+	level = None
+	holdoff = None
+
+    def mode(self, value):
+	if value != None:
+	    if  value != self.mode:
+		self.scope.send(":TRIG"+str(self.number)+":SCAL "+str(value))
+		self.scale = value
+	else:
+	    self.scale =  self.scope.query(":CHAN"+str(self.number)+":SCAL?")
+	return self.scale
+
+    def source(self, value):
+	if value != None:
+	    if  value != self.scale:
+		self.scope.send(":CHAN"+str(self.number)+":SCAL "+str(value))
+		self.scale = value
+	else:
+	    self.scale =  self.scope.query(":CHAN"+str(self.number)+":SCAL?")
+	return self.scale
+
+    def sweep(self, value):
+	if value != None:
+	    if  value != self.sweep:
+		self.scope.send(":CHAN"+self.mode+":SWE "+str(value))
+		self.sweep = value
+	else:
+	    self.sweep = self.scope.query(":CHAN"+self.mode+":SWE?")
+	return self.sweep
+
+    def level(self, value):
+	if value != None:
+	    if  value != self.level:
+		self.scope.send(":TRIG:"+self.mode+":LEV "+str(value))
+		self.scale = level 
+	else:
+	    self.level =  self.scope.query(":TRIG:"+self.mode+":LEV?")
+	return self.leve
+
+    def holdoff(self, value):
+	if value != None:
+	    if  value != self.scale:
+		self.scope.send(":CHAN"+str(self.number)+":SCAL "+str(value))
+		self.scale = value
+	else:
+	    self.scale =  self.scope.query(":CHAN"+str(self.number)+":SCAL?")
+	return self.scale


Property changes on: developers/werner/ahrt/host/tmc/lib/trigger.py
___________________________________________________________________
Name: svn:executable
   + *

Added: developers/werner/ahrt/host/tmc/lib/wave.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/wave.py	                        (rev 0)
+++ developers/werner/ahrt/host/tmc/lib/wave.py	2008-08-21 07:48:11 UTC (rev 4601)
@@ -0,0 +1,251 @@
+#!/usr/bin/python
+#
+# wave.py - Analog and digital waveforms
+#
+
+# waveform: (t, v)*
+# delta-waveform (digital): (s0, t*)
+# events: t*
+# samples: v*
+
+# digitize: (t, v)*  ->  (s0, t*)
+
+# clock extraction:
+#  rising   (s0, t*)  ->  t*
+#  falling  (s0, t*)  ->  t*
+#  both     (s0, t*)  ->  t*
+
+# clock arithmetic:
+#  divide   t*  ->  t*
+#  multiply (divide interval)  t* -> t*
+#       monoflop  t* -> t*
+#  PLL  t* -> t*
+
+# clock recovery:
+#  implicit t*  ->  t*
+
+# sample: (t, v)*  x  t*  ->  v*
+#     or  (s0, t*)  x  t*  ->  v*
+
+
+
+# === Waves ===================================================================
+
+
+class wave(object):
+
+    def dump(self, name, append = False):
+	f = open(name, ("w", "a")[append])
+	if append:
+	    print >>f
+	for xy in self:
+	    print >>f, xy[0], xy[1]
+	f.close()
+
+    def get(self, t):
+	if isinstance(t, list):
+	    res = []
+	    for v in t:
+		res.append(self.get_one(v))
+	    return res
+	else:
+	    return self.get_one(t)
+
+
+# === Analog waves ============================================================
+
+
+class analog_wave_iter:
+
+    def __init__(self, wave):
+	self.wave = wave
+	self.pos = 0
+
+    def next(self):
+	if self.pos == len(self.wave.data):
+	    raise StopIteration
+	res = self.wave.data[self.pos]
+	self.pos += 1
+	return res
+
+
+#
+# This is a special binary search: if there's no exact match, we return the
+# index of the element preceding the value. If the value is less than the first
+# element, we return -1.
+#
+
+def binary(list, item, find):
+    low = 0
+    high = len(list)
+    while low != high:
+	mid = (low+high) >> 1
+	if item(list[mid]) < find:
+	    low = mid+1
+	else:
+	    high = mid
+    if low == len(list):
+	return low-1
+    if item(list[low]) > find:
+	return low-1
+    return low
+
+
+class analog_wave(wave):
+
+    def __init__(self):
+	self.data = []
+
+    def start(self):
+	if len(self.data) == 0:
+	    return None
+	return self.data[0][0]
+
+    def end(self):
+	if len(self.data) == 0:
+	    return None
+	return self.data[-1][0]
+
+    def append(self, t, y):
+	if len(self.data) and t <= self.data[-1][0]:
+	    raise hell
+	self.data.append((t, y))
+
+    def get_one(self, t):
+	if len(self.data) == 0 or t < self.data[0][0] or t > self.data[-1][0]:
+	    raise hell
+	return self.wave.data[binary(self.wave.data, lambda x: x[0], t)]
+
+    def __iter__(self):
+	return analog_wave_iter(self)
+
+    def __len__(self):
+	return len(self.data.wave)
+
+
+# === Digital waves ===========================================================
+
+
+class digital_wave_iter:
+
+    def __init__(self, wave):
+	self.wave = wave
+	self.pos = 0
+	self.risen = True
+
+    def next(self):
+	if self.pos > len(self.wave.data):
+	    raise StopIteration
+	elif self.pos == len(self.wave.data):
+	    self.pos += 1
+	    return (self.wave.t_end,
+	      int((len(self.wave.data) & 1) ^ (not self.wave.initial)))
+	res = (self.wave.data[self.pos],
+	  int((self.pos & 1) ^ self.wave.initial ^ (not self.risen)))
+	if self.risen:
+	    self.pos += 1
+	self.risen = not self.risen
+	return res
+
+
+class digital_wave(wave):
+
+    def __init__(self):
+	self.initial = None
+	self.data = []
+	self.cursor = None
+	self.t_end = None
+
+    def start(self):
+	if self.initial is None:
+	    return None
+	return self.data[0]
+
+    def end(self):
+	return self.t_end
+
+    def append(self, t, y):
+	if self.t_end is not None and t < self.t_end:
+	    raise hell
+	if self.initial is None:
+	    self.initial = not not y
+	if self.initial == (not not y, not y)[len(self.data) & 1]:
+	    self.data.append(t)
+	self.t_end = t
+
+    def get_one(self, t):
+	if len(self.data) == 0 or t < self.data[0] or t > self.t_end:
+	    raise hell
+	return int(self.initial ^
+	  (binary(self.data, lambda x: x, t) & 1))
+
+    def __iter__(self):
+	return digital_wave_iter(self)
+
+    # @@@ experimental ! maybe use triggers instead ?
+
+    def edges(self, rising, falling = None):
+	if falling is None:
+	    falling = not rising
+	if (not falling) and (not rising):
+	    return []
+	res = []
+	if falling and rising:
+	    i = 1
+	    while i != len(self.data):
+		res.append(self.data[i])
+		i += 1
+	    return res
+	else:
+	    i = int(self.initial ^ (not rising))+1
+	    while i < len(self.data):
+		res.append(self.data[i])
+		i += 2
+	    return res
+
+    # @@@ experimental !
+
+    def debounce(self, t):
+	i = 0
+	while i < len(self.data)-1:
+	    if self.data[i]+t <= self.data[i+1]:
+		i += 1
+	    else:
+		if i+2 == len(self.data) or self.data[i]+t >= self.data[i+2]:
+		    del self.data[i]
+		    del self.data[i]
+		else:
+		    i += 1
+
+    def __len__(self):
+	return len(self.data)*2
+
+
+# === @@@ Work in progress ====================================================
+
+
+def digitize(wave, vl, vh):
+    delta = []
+    state = 0  # high: 2, rise: 1, unknown: 0, fall: -1, low: -2
+    s0 = None
+    t0 = None
+    for p in wave:
+	if p[1] >= vh:
+	    pass
+	elif p1[x] <= vl:
+	    pass
+	else:
+	    pass
+	if state == 2:  # high
+	    pass
+	elif state == -2:  # low
+	    pass
+	elif state == 1:  # rise
+	    pass
+	elif state == -1:  # fall
+	    pass
+	else:  # unknown
+	    pass
+    if s0 == None:
+	return None
+    return (s0, delta)


Property changes on: developers/werner/ahrt/host/tmc/lib/wave.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: developers/werner/ahrt/host/tmc/telnet.c
===================================================================
--- developers/werner/ahrt/host/tmc/telnet.c	2008-08-19 06:24:01 UTC (rev 4600)
+++ developers/werner/ahrt/host/tmc/telnet.c	2008-08-21 07:48:11 UTC (rev 4601)
@@ -56,6 +56,7 @@
 struct telnet_dsc {
 	int sd;		/* socket descriptor */
 	int crlf;	/* 0 = in message, 1 = CR seen, 2 = CRLF seen */
+	int nl;		/* 0 = complain about extra \n, 1 = don't */
 	int max_tries;	/* number of times we try to set up the connection */
 	int tries_left;	/* number of attempts left */
 	struct sockaddr_in addr; /* peer address */
@@ -66,7 +67,7 @@
 
 static void usage(void)
 {
-	fprintf(stderr, "usage: \"telnet\", [tries=N,] host [, port]\n");
+	fprintf(stderr, "usage: \"telnet\", [tries=N,] [nl,] host [, port]\n");
 }
 
 
@@ -105,32 +106,36 @@
 	const struct servent *se;
 	unsigned long num;
 	char *end;
+	int i;
 
-	if (argc && strchr(argv[0], '=')) {
-		if (strncmp(argv[0], "tries=", 6)) {
-			usage();
-			return NULL;
+	d = malloc(sizeof(struct telnet_dsc));
+	if (!d) {
+		perror("malloc");
+		return NULL;
+	}
+	d->nl = 0;
+
+	for (i = 0; i != argc; i++) {
+		if (!strncmp(argv[i], "tries=", 6)) {
+			tries = strtoul(argv[0]+6, &end, 0);
+			if (*end || !tries) {
+				usage();
+				return NULL;
+			}
 		}
-		tries = strtoul(argv[0]+6, &end, 0);
-		if (*end || !tries) {
-			usage();
-			return NULL;
+		else if (!strcmp(argv[i], "nl")) {
+			d->nl = 1;
 		}
-		argc--;
-		argv++;
+		else
+			break;
 	}
-	if (!argc || argc > 2) {
+	if (i == argc || i-argc > 2) {
 		usage();
 		return NULL;
 	}
-	host = argv[0];
-	port = argc == 2 ? argv[1] : DEFAULT_PORT;
+	host = argv[i];
+	port = argc > i+1 ? argv[i+1] : DEFAULT_PORT;
 
-	d = malloc(sizeof(struct telnet_dsc));
-	if (!d) {
-		perror("malloc");
-		return NULL;
-	}
 	d->crlf = 0;
 
 	d->addr.sin_family = AF_INET;
@@ -263,7 +268,7 @@
 				d->crlf = 1;
 				break;
 			case '\n':
-				if (d->crlf != 1)
+				if (d->crlf != 1 && !d->nl)
 					fprintf(stderr,
 					    "warning: unexpected \\n\n");
 				d->crlf = 2;

Modified: developers/werner/ahrt/host/tmc/usbtmc.c
===================================================================
--- developers/werner/ahrt/host/tmc/usbtmc.c	2008-08-19 06:24:01 UTC (rev 4600)
+++ developers/werner/ahrt/host/tmc/usbtmc.c	2008-08-21 07:48:11 UTC (rev 4601)
@@ -452,7 +452,7 @@
 				goto usage;
 		}
 		else if (!strncmp(argv[i], "vendor=", 7)) {
-			device = strtoul(argv[i]+7, &end, 0);
+			vendor = strtoul(argv[i]+7, &end, 0);
 			if (*end || !vendor || vendor > 0xffff)
 				goto usage;
 		}




More information about the commitlog mailing list