linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mattias Nissler <mattias.nissler@gmx.de>
To: Stefano Brivio <stefano.brivio@polimi.it>
Cc: linux-wireless <linux-wireless@vger.kernel.org>
Subject: Re: [WIP][PATCH] rc80211_pid: Send events to userspace for debugging
Date: Wed, 12 Dec 2007 01:07:24 +0100	[thread overview]
Message-ID: <1197418044.7030.32.camel@localhost> (raw)
In-Reply-To: <1197414686.7030.27.camel@localhost>

[-- Attachment #1: Type: text/plain, Size: 444 bytes --]

Hi,

Ok, I just decided I make the script generate a second graph. Updated
script is attached, new sample graph is at
http://www-user.rhrk.uni-kl.de/~nissler/rate_control_sample_graph2.ps

I guess from the second graph we can see that the integration interval
is too large. I think I should try increasing the proportional
coefficient and decrease the integral coefficient. What do you think?
Control theory people please speak up :-)

Mattias

[-- Attachment #2: make_pid_graph.py --]
[-- Type: text/x-python, Size: 4508 bytes --]

#!/usr/bin/python
#
# Feed an rc80211_pid events file into gnuplot to create a nice graph.
#

import os
import sys
import subprocess
import optparse

# configurable options
options = optparse.Values()

options.arith_scale_factor = float(256)
options.graph_width = None
options.graph_height = 10 
options.units_per_jiffy = 0.0002
options.xtics = 10000
options.events_file_name = None
options.output_file_name = '-'
options.gnuplot_path = '/usr/bin/gnuplot'

def plot_frames_rate_graph(gpo, events):

	# configure the axes
	gpo.write('set xlabel "Time [jiffies]"\n')
	gpo.write('set xrange [0:%f]\n' % events[-1][1])
	gpo.write('set xtics %d\n' % options.xtics)
	gpo.write('set ylabel "Failed frames [%]"\n')
	gpo.write('set yrange [0:50]\n')
	gpo.write('set ytics 5 nomirror\n')
	gpo.write('set y2label "TX rate [Mbit/s]\n')
	gpo.write('set y2range [0:60]\n')
	gpo.write('set y2tics 5 nomirror\n')

	gpo.write('plot "-" axes x1y1 title "failed frames percentage" with linespoints,')
	gpo.write('"-" axes x1y2 title "TX rate" with linespoints\n')

	for e in filter(lambda x: x[2] == 'pf_sample', events):
		gpo.write('%f %f\n' % (float(e[1]), float(e[3]) / options.arith_scale_factor))

	gpo.write('e\n');
	
	for e in filter(lambda x: x[2] == 'tx_rate', events):
		gpo.write('%f %f\n' % (float(e[1]), float(e[4]) / 10.0))

	gpo.write('e\n');

def plot_frames_error_graph(gpo, events):

	# configure the axes
	gpo.write('set xlabel "Time [jiffies]"\n')
	gpo.write('set xrange [0:%f]\n' % events[-1][1])
	gpo.write('set xtics %d\n' % options.xtics)
	gpo.write('set xzeroaxis\n')
	gpo.write('set ylabel "Failed frames [%]"\n')
	gpo.write('set yrange [-50:50]\n')
	gpo.write('set ytics 5 nomirror\n')
	gpo.write('set y2label "Error [%]\n')
	gpo.write('set y2range [-50:50]\n')
	gpo.write('set y2tics 5 nomirror\n')

	gpo.write('plot "-" axes x1y1 title "failed frames percentage" with linespoints,')
	gpo.write('"-" axes x1y2 title "proportional error" with linespoints,')
	gpo.write('"-" axes x1y2 title "integral error" with linespoints,')
	gpo.write('"-" axes x1y2 title "derivation error" with linespoints\n')

	for e in filter(lambda x: x[2] == 'pf_sample', events):
		gpo.write('%f %f\n' % (float(e[1]), float(e[3]) / options.arith_scale_factor))

	gpo.write('e\n');
	
	for e in filter(lambda x: x[2] == 'pf_sample', events):
		gpo.write('%f %f\n' % (float(e[1]), float(e[4]) / options.arith_scale_factor))

	gpo.write('e\n');
	
	for e in filter(lambda x: x[2] == 'pf_sample', events):
		gpo.write('%f %f\n' % (float(e[1]), float(e[5]) / options.arith_scale_factor))

	gpo.write('e\n');
	
	for e in filter(lambda x: x[2] == 'pf_sample', events):
		gpo.write('%f %f\n' % (float(e[1]), float(e[6]) / options.arith_scale_factor))

	gpo.write('e\n');

def parse_options():
	parser = optparse.OptionParser()

	parser.add_option('-i', '--infile', dest='events_file_name',
		help='rc80211_pid event dump file')
	parser.add_option('-o', '--outfile', dest='output_file_name',
		help='Output file to which graph is written')
	parser.add_option('-y', '--height', type='int', dest='graph_height',
		help='Width of the diagram')
	parser.add_option('-x', '--width', type='int', dest='graph_width',
		help='Height of the diagram')

	parser.parse_args(sys.argv[1:], options)

	parser.destroy()

def main():
	# Parse options
	parse_options();

	# read the input
	if options.events_file_name is None:
		eventsfile = sys.stdin
	else:
		eventsfile = open(options.events_file_name, 'r')

	events = map(lambda x: x.split(), eventsfile.readlines())
	eventsfile.close()

	if len(events) == 0:
		raise 'No input!'

	# calculate time interval
	time_start = int(events[0][1])
	time_end = int(events[-1][1])
	time_diff = time_end - time_start

	# normalize time
	for e in events:
		e[1] = int(e[1]) - time_start

	# open a pipe to gnuplot
	gpp = subprocess.Popen(options.gnuplot_path, stdin=subprocess.PIPE)
	gpo = gpp.stdin

	# configure the gnuplot output
	if options.graph_width is None:
		options.graph_width = time_diff * options.units_per_jiffy

	nplots = 2

	gpo.write('set terminal postscript color lw 0.1 size %fcm, %fcm font "Helvetica" 9\n' %
		(options.graph_width, options.graph_height * nplots))
	gpo.write('set output "%s"\n' % options.output_file_name)

	# plot the graphs
	gpo.write('set multiplot layout %d,1 columnsfirst downwards\n' % nplots)

	plot_frames_rate_graph(gpo, events);

	plot_frames_error_graph(gpo, events);
	
	gpo.write('unset multiplot\n')

	# done!
	gpo.close()

if __name__ == '__main__':
	main()


  parent reply	other threads:[~2007-12-12  0:07 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-12-11 23:11 [WIP][PATCH] rc80211_pid: Send events to userspace for debugging Mattias Nissler
2007-12-11 23:58 ` Stefano Brivio
2007-12-12  0:07 ` Mattias Nissler [this message]
2007-12-12  0:10   ` Stefano Brivio
2007-12-12  0:33     ` Mattias Nissler
2007-12-14 22:14 ` Stefano Brivio
2007-12-15 17:56   ` John W. Linville
2007-12-15 22:13     ` Mattias Nissler
2007-12-16  2:24       ` John W. Linville

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1197418044.7030.32.camel@localhost \
    --to=mattias.nissler@gmx.de \
    --cc=linux-wireless@vger.kernel.org \
    --cc=stefano.brivio@polimi.it \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).