Automated generation of the Geometry enum to make addition of the new multirotor a really simple task

This commit is contained in:
Anton Matosov
2015-01-05 00:30:49 +02:00
parent 388833a1fa
commit 8fadbdcf2f
3 changed files with 93 additions and 96 deletions

View File

@@ -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.

View File

@@ -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 <debug.h>
@@ -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,

View File

@@ -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]
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 "};"
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 ""