summaryrefslogtreecommitdiffhomepage
path: root/digital/asserv/tools/gen_eeprom_default.py
diff options
context:
space:
mode:
authorNicolas Schodet2009-05-19 08:52:25 +0200
committerNicolas Schodet2012-03-28 22:40:20 +0200
commit203401d8e656aaf704953288ed5efcd5ca60ffe4 (patch)
tree168499059049d91fb909f10e53a364c2e0c284e4 /digital/asserv/tools/gen_eeprom_default.py
parentd0aec27b44e7b7dae6ddb583498956829e3bb33e (diff)
digital/asserv, digital/mimot: use new eeprom code
Diffstat (limited to 'digital/asserv/tools/gen_eeprom_default.py')
-rw-r--r--digital/asserv/tools/gen_eeprom_default.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/digital/asserv/tools/gen_eeprom_default.py b/digital/asserv/tools/gen_eeprom_default.py
new file mode 100644
index 00000000..d24950f2
--- /dev/null
+++ b/digital/asserv/tools/gen_eeprom_default.py
@@ -0,0 +1,105 @@
+# asserv - Position & speed motor control on AVR. {{{
+#
+# Copyright (C) 2012 Nicolas Schodet
+#
+# APBTeam:
+# Web: http://apbteam.org/
+# Email: team AT apbteam DOT org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# }}}
+from asserv import Proto
+import asserv.init
+import sys
+
+if len (sys.argv) != 3 or sys.argv[1] not in ('host', 'target'):
+ print >> sys.stderr, "usage: %s <host|target> <robot>" % sys.argv[0]
+ sys.exit (1)
+
+target, robot = sys.argv[1:]
+
+init = dict (host = asserv.init.host,
+ target = asserv.init.target)[target]
+if robot not in init:
+ print >> sys.stderr, "unknown robot"
+ sys.exit (1)
+
+proto = Proto (None, **init[robot])
+
+params = proto.param
+
+template = """\
+/* Autogenerated file, do not edit! */
+
+#ifdef EEPROM_DEFAULTS_KEY
+# error "duplicated definition"
+#endif
+
+#define EEPROM_DEFAULTS_KEY {key:#x}
+
+struct eeprom_t PROGMEM eeprom_defaults =
+{defaults};
+"""
+
+def param (name, offset = 0, m = None):
+ if m:
+ mname = m + '_' + name
+ if mname in params:
+ name = mname
+ value = params[name]
+ if offset:
+ value = int (round (value * (1 << offset)))
+ return '0x%x /* %s */' % (value, name)
+
+def j (*params):
+ return '{\n ' + ',\n '.join (p.replace ('\n', '\n ')
+ for p in params) + '\n}'
+
+indexes = [ 't', 'a' ] + [ 'a%d' % i for i in xrange (proto.aux_nb) ]
+outputs = [ 'l', 'r' ] + [ 'a%d' % i for i in xrange (proto.aux_nb) ]
+
+key = 0x50
+defaults = j (
+ 'EEPROM_DEFAULTS_KEY',
+ param ('encoder_right_correction', offset = 24),
+ j (*[j (
+ param ('speed_max', m = m),
+ param ('speed_slow', m = m),
+ param ('acc', offset = 8, m = m))
+ for m in indexes]),
+ j (*[j (
+ param ('kp', offset = 8, m = m),
+ param ('ki', offset = 8, m = m),
+ param ('kd', offset = 8, m = m),
+ param ('e_sat', m = m),
+ param ('i_sat', m = m),
+ param ('d_sat', m = m))
+ for m in indexes]),
+ j (*[j (
+ param ('bd_error_limit', m = m),
+ param ('bd_speed_limit', m = m),
+ param ('bd_counter_limit', m = m))
+ for m in indexes]),
+ j (*[j (
+ param ('reverse', m = m))
+ for m in outputs]),
+ param ('footing'),
+ param ('eps'),
+ param ('aeps'),
+ param ('angle_limit'),
+ '0')
+
+print template.format (key = key, defaults = defaults)