From 6da095af71ec38f246aef8fa9fc10a79544483e5 Mon Sep 17 00:00:00 2001
From: Ingo Ruhnke <grumbel@gmx.de>
Date: Sat, 29 Jan 2011 18:42:38 +0100
Subject: [PATCH] Added [controllerN/configN/buttonmap], ... sections

---
 TODO                         | 10 +---
 src/command_line_options.cpp | 91 ++++++++++++++++++++++++++++++++++++
 src/command_line_options.hpp | 20 ++++++--
 3 files changed, 110 insertions(+), 11 deletions(-)

diff --git a/TODO b/TODO
index 133b6fb..2b0edd9 100644
--- a/TODO
+++ b/TODO
@@ -62,14 +62,8 @@ Stuff to do before 0.7.1 release:
 
 * valgrind before release
 
-* allow named sections in INI files (start numbering at 0 or 1?):
-
-  [controller1/modifier]
-  [controller1/config1/modifier]
-  [controller2/modifier]
-  [controller2/modifier]
-  [controller3/config1/modifier]
-  [controller3/config2/modifier]
+* allow named sections in INI files (start numbering at 0 or 1,
+  calibration is missing)
 
 * check how daemon reacts on suspend
   - suspending the computer leads to LIBUSB_ERROR_IO, unplugging the
diff --git a/src/command_line_options.cpp b/src/command_line_options.cpp
index ea24114..38f27cb 100644
--- a/src/command_line_options.cpp
+++ b/src/command_line_options.cpp
@@ -21,6 +21,7 @@
 #include <fstream>
 #include <iostream>
 #include <boost/bind.hpp>
+#include <boost/format.hpp>
 #include <boost/tokenizer.hpp>
 
 #include "evdev_helper.hpp"
@@ -391,6 +392,33 @@ CommandLineParser::init_ini(Options* opts)
   m_ini.section("calibration",   boost::bind(&CommandLineParser::set_calibration, this, _1, _2));
   m_ini.section("axis-sensitivity",   boost::bind(&CommandLineParser::set_axis_sensitivity, this, _1, _2));
 
+  for(int controller = 0; controller <= 9; ++controller)
+  {
+    for(int config = 0; config <= 9; ++config)
+    {
+      m_ini.section((boost::format("controller%d/config%d/modifier") % controller % config).str(),
+                    boost::bind(&CommandLineParser::set_modifier_n, this, controller, config, _1, _2));
+      m_ini.section((boost::format("controller%d/config%d/ui-buttonmap") % controller % config).str(),
+                    boost::bind(&CommandLineParser::set_ui_buttonmap_n, this, controller, config, _1, _2));
+      m_ini.section((boost::format("controller%d/config%d/ui-axismap") % controller % config).str(), 
+                    boost::bind(&CommandLineParser::set_ui_axismap_n, this, controller, config, _1, _2));
+
+      m_ini.section((boost::format("controller%d/config%d/buttonmap") % controller % config).str(),
+                    boost::bind(&CommandLineParser::set_buttonmap_n, this, controller, config, _1, _2));
+      m_ini.section((boost::format("controller%d/config%d/axismap") % controller % config).str(), 
+                    boost::bind(&CommandLineParser::set_axismap_n,   this, controller, config, _1, _2));
+
+      m_ini.section((boost::format("controller%d/config%d/autofire") % controller % config).str(), 
+                    boost::bind(&CommandLineParser::set_autofire_n, this, controller, config, _1, _2));
+      m_ini.section((boost::format("controller%d/config%d/relative-axis") % controller % config).str(), 
+                    boost::bind(&CommandLineParser::set_relative_axis_n, this, controller, config, _1, _2));
+      m_ini.section((boost::format("controller%d/config%d/calibration") % controller % config).str(), 
+                    boost::bind(&CommandLineParser::set_calibration_n, this, controller, config, _1, _2));
+      m_ini.section((boost::format("controller%d/config%d/axis-sensitivity") % controller % config).str(), 
+                    boost::bind(&CommandLineParser::set_axis_sensitivity_n, this, controller, config, _1, _2));
+    }
+  }
+
   m_ini.section("evdev-absmap", boost::bind(&CommandLineParser::set_evdev_absmap, this, _1, _2));
   m_ini.section("evdev-keymap", boost::bind(&CommandLineParser::set_evdev_keymap, this, _1, _2));
 }
@@ -1121,4 +1149,67 @@ CommandLineParser::read_alt_config_file(Options* opts, const std::string& filena
   read_config_file(opts, filename);
 }
 
+void
+CommandLineParser::set_ui_buttonmap_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  m_options->controller_slots[controller].get_options(config)
+    .uinput.set_ui_buttonmap(name, value);
+}
+
+void
+CommandLineParser::set_ui_axismap_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  m_options->controller_slots[controller].get_options(config)
+    .uinput.set_ui_axismap(name, value);
+}
+
+void
+CommandLineParser::set_modifier_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  m_options->controller_slots[controller].get_options(config)
+    .modifier.push_back(ModifierPtr(Modifier::from_string(name, value)));
+}
+
+void
+CommandLineParser::set_axismap_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  m_options->controller_slots[controller].get_options(config)
+    .axismap->add(AxisMapping::from_string(name, value));
+}
+
+void
+CommandLineParser::set_buttonmap_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  m_options->controller_slots[controller].get_options(config)
+    .buttonmap->add(ButtonMapping::from_string(name, value));
+}
+
+void
+CommandLineParser::set_relative_axis_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  m_options->controller_slots[controller].get_options(config)
+    .relative_axis_map[string2axis(name)] = AxisFilterPtr(new RelativeAxisFilter(boost::lexical_cast<int>(value)));
+}
+
+void
+CommandLineParser::set_autofire_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  m_options->controller_slots[controller].get_options(config)
+    .autofire_map[string2btn(name)] = ButtonFilterPtr(new AutofireButtonFilter(boost::lexical_cast<int>(value), 0));
+}
+
+void
+CommandLineParser::set_calibration_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  // FIXME: not implemented
+  assert(!"implement me");
+}
+
+void
+CommandLineParser::set_axis_sensitivity_n(int controller, int config, const std::string& name, const std::string& value)
+{
+  m_options->controller_slots[controller].get_options(config)
+    .sensitivity_map[string2axis(name)] = AxisFilterPtr(new SensitivityAxisFilter(boost::lexical_cast<float>(value)));
+}
+
 /* EOF */
diff --git a/src/command_line_options.hpp b/src/command_line_options.hpp
index 6734003..5612d9c 100644
--- a/src/command_line_options.hpp
+++ b/src/command_line_options.hpp
@@ -53,20 +53,34 @@ private:
   void set_axismap(const std::string& name, const std::string& value);
   void set_buttonmap(const std::string& name, const std::string& value);
 
-  void set_evdev_absmap(const std::string& name, const std::string& value);
-  void set_evdev_keymap(const std::string& name, const std::string& value);
-
   void set_relative_axis(const std::string& name, const std::string& value);
   void set_autofire(const std::string& name, const std::string& value);
   void set_calibration(const std::string& name, const std::string& value);
   void set_axis_sensitivity(const std::string& name, const std::string& value);
 
+
+  void set_ui_buttonmap_n(int controller, int config, const std::string& name, const std::string& value);
+  void set_ui_axismap_n(int controller, int config, const std::string& name, const std::string& value);
+  void set_modifier_n(int controller, int config, const std::string& name, const std::string& value);
+
+  void set_axismap_n(int controller, int config, const std::string& name, const std::string& value);
+  void set_buttonmap_n(int controller, int config, const std::string& name, const std::string& value);
+
+  void set_relative_axis_n(int controller, int config, const std::string& name, const std::string& value);
+  void set_autofire_n(int controller, int config, const std::string& name, const std::string& value);
+  void set_calibration_n(int controller, int config, const std::string& name, const std::string& value);
+  void set_axis_sensitivity_n(int controller, int config, const std::string& name, const std::string& value);
+
+
   void set_deadzone(const std::string& value);
   void set_deadzone_trigger(const std::string& value);
   void set_square_axis();
   void set_four_way_restrictor();
   void set_dpad_rotation(const std::string& value);
 
+  void set_evdev_absmap(const std::string& name, const std::string& value);
+  void set_evdev_keymap(const std::string& name, const std::string& value);
+
   void read_config_file(Options* opts, const std::string& filename);
   void read_alt_config_file(Options* opts, const std::string& filename);