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