From 8fadbdcf2fee463498228abeac038260f51460b1 Mon Sep 17 00:00:00 2001 From: Anton Matosov Date: Mon, 5 Jan 2015 00:30:49 +0200 Subject: Automated generation of the Geometry enum to make addition of the new multirotor a really simple task --- src/modules/systemlib/mixer/mixer.h | 18 +-- src/modules/systemlib/mixer/mixer_multirotor.cpp | 7 +- src/modules/systemlib/mixer/multi_tables | 166 ++++++++++++----------- 3 files changed, 94 insertions(+), 97 deletions(-) diff --git a/src/modules/systemlib/mixer/mixer.h b/src/modules/systemlib/mixer/mixer.h index 1fe4380ad..a0197df48 100644 --- a/src/modules/systemlib/mixer/mixer.h +++ b/src/modules/systemlib/mixer/mixer.h @@ -453,23 +453,9 @@ public: /** * Supported multirotor geometries. * - * XXX add more + * Values are generated by the multi_tables script and placed to mixer_multirotor.generated.h */ - enum Geometry { - QUAD_X = 0, /**< quad in X configuration */ - QUAD_PLUS, /**< quad in + configuration */ - QUAD_V, /**< quad in V configuration */ - QUAD_WIDE, /**< quad in wide configuration */ - HEX_X, /**< hex in X configuration */ - HEX_PLUS, /**< hex in + configuration */ - HEX_COX, - OCTA_X, - OCTA_PLUS, - OCTA_COX, - TWIN_ENGINE, /**< VTOL: one engine on each wing */ - - MAX_GEOMETRY - }; + enum Geometry : unsigned int; /** * Precalculated rotor mix. diff --git a/src/modules/systemlib/mixer/mixer_multirotor.cpp b/src/modules/systemlib/mixer/mixer_multirotor.cpp index bb3868c34..42e3513f4 100644 --- a/src/modules/systemlib/mixer/mixer_multirotor.cpp +++ b/src/modules/systemlib/mixer/mixer_multirotor.cpp @@ -55,6 +55,9 @@ #include "mixer.h" +// This file is generated by the multi_tables script which is invoked during the build process +#include "mixer_multirotor.generated.h" + #define debug(fmt, args...) do { } while(0) //#define debug(fmt, args...) do { printf("[mixer] " fmt "\n", ##args); } while(0) //#include @@ -72,10 +75,6 @@ float constrain(float val, float min, float max) { return (val < min) ? min : ((val > max) ? max : val); } - -// This file is generated by the multi_tables script which is invoked during the build process -#include "mixer_multirotor.generated.h" - } MultirotorMixer::MultirotorMixer(ControlCallback control_cb, diff --git a/src/modules/systemlib/mixer/multi_tables b/src/modules/systemlib/mixer/multi_tables index 1f47ca63d..b29bf540a 100755 --- a/src/modules/systemlib/mixer/multi_tables +++ b/src/modules/systemlib/mixer/multi_tables @@ -3,9 +3,8 @@ # Generate multirotor mixer scale tables compatible with the ArduCopter layout # - puts "/*" -puts "* These tables automatically generated by multi_tables - do not edit." +puts "* These file is automatically generated by multi_tables - do not edit." puts "*/" puts "" @@ -14,17 +13,17 @@ proc rcos {a} { expr cos([rad $a])} set quad_x { - 45 CCW - -135 CCW - -45 CW - 135 CW + 45 CCW + -135 CCW + -45 CW + 135 CW } set quad_plus { - 90 CCW - -90 CCW - 0 CW - 180 CW + 90 CCW + -90 CCW + 0 CW + 180 CW } set quad_v { @@ -35,70 +34,70 @@ set quad_v { } set quad_wide { - 68 CCW - -129 CCW - -68 CW - 129 CW + 68 CCW + -129 CCW + -68 CW + 129 CW } set hex_x { - 90 CW - -90 CCW - -30 CW - 150 CCW - 30 CCW - -150 CW + 90 CW + -90 CCW + -30 CW + 150 CCW + 30 CCW + -150 CW } set hex_plus { - 0 CW - 180 CCW - -120 CW - 60 CCW - -60 CCW - 120 CW + 0 CW + 180 CCW + -120 CW + 60 CCW + -60 CCW + 120 CW } set hex_cox { - 60 CW - 60 CCW - 180 CW - 180 CCW - -60 CW - -60 CCW + 60 CW + 60 CCW + 180 CW + 180 CCW + -60 CW + -60 CCW } set octa_x { - 22.5 CW - -157.5 CW - 67.5 CCW - 157.5 CCW - -22.5 CCW - -112.5 CCW - -67.5 CW - 112.5 CW + 22.5 CW + -157.5 CW + 67.5 CCW + 157.5 CCW + -22.5 CCW + -112.5 CCW + -67.5 CW + 112.5 CW } set octa_plus { - 0 CW - 180 CW - 45 CCW - 135 CCW - -45 CCW - -135 CCW - -90 CW - 90 CW + 0 CW + 180 CW + 45 CCW + 135 CCW + -45 CCW + -135 CCW + -90 CW + 90 CW } set octa_cox { - 45 CCW - -45 CW - -135 CCW - 135 CW - -45 CCW - 45 CW - 135 CCW - -135 CW + 45 CCW + -45 CW + -135 CCW + 135 CW + -45 CCW + 45 CW + 135 CCW + -135 CW } set twin_engine { @@ -106,39 +105,52 @@ set twin_engine { -90 0.0 } + set tables {quad_x quad_plus quad_v quad_wide hex_x hex_plus hex_cox octa_x octa_plus octa_cox twin_engine} +puts "enum MultirotorMixer::Geometry : unsigned int {" +foreach table $tables { + puts [format "\t%s," [string toupper $table]] +} +puts "\n\tMAX_GEOMETRY" +puts "}; // enum MultirotorMixer::Geometry\n" + + +puts "namespace {" + proc factors {a d} { puts [format "\t{ %9.6f, %9.6f, %9.6f }," [rcos [expr $a + 90]] [rcos $a] [expr $d]]} foreach table $tables { - puts [format "const MultirotorMixer::Rotor _config_%s\[\] = {" $table] - - upvar #0 $table angles - foreach {angle dir} $angles { - if {$dir == "CW"} { - set dd -1.0 - } elseif {$dir == "CCW"} { - set dd 1.0 - } else { - set dd $dir - } - factors $angle $dd - } - puts "};" + puts [format "const MultirotorMixer::Rotor _config_%s\[\] = {" $table] + + upvar #0 $table angles + foreach {angle dir} $angles { + if {$dir == "CW"} { + set dd -1.0 + } elseif {$dir == "CCW"} { + set dd 1.0 + } else { + set dd $dir + } + factors $angle $dd + } + puts "};\n" } -puts "const MultirotorMixer::Rotor *_config_index\[MultirotorMixer::MAX_GEOMETRY\] = {" +puts "const MultirotorMixer::Rotor *_config_index\[\] = {" foreach table $tables { - puts [format "\t&_config_%s\[0\]," $table] + puts [format "\t&_config_%s\[0\]," $table] } -puts "};" +puts "};\n" -puts "const unsigned _config_rotor_count\[MultirotorMixer::MAX_GEOMETRY\] = {" +puts "const unsigned _config_rotor_count\[\] = {" foreach table $tables { - upvar #0 $table angles - puts [format "\t%u, /* %s */" [expr [llength $angles] / 2] $table] + upvar #0 $table angles + puts [format "\t%u, /* %s */" [expr [llength $angles] / 2] $table] } -puts "};" +puts "};\n" + +puts "} // anonymous namespace\n" # Newline at the end of file puts "" -- cgit v1.2.3