Example #1
0
void
Joystick::load(const XMLReader& root_reader)
{
  std::string cfg_name;
  if (root_reader.read("name", cfg_name) && name == cfg_name)
    {
      // Read calibration data
      if (XMLReader reader = root_reader.get_section("calibration"))
        {
          std::vector<CalibrationData> calibration_data;
          const std::vector<XMLReader>& sections = reader.get_sections();
          for(std::vector<XMLReader>::const_iterator i = sections.begin(); i != sections.end(); ++i)
            {
              CalibrationData data;

              //i->read("axis", );
              //i->read("precision", );
              i->read("invert",     data.invert);
              i->read("center-min", data.center_min);
              i->read("center-max", data.center_max);
              i->read("range-min",  data.range_min);
              i->read("range-max",  data.range_max);

              calibration_data.push_back(data);
            }

          set_calibration(calibration_data);
        }

      { // Read axis mapping
        const std::vector<std::string>& cfg_axis_map = root_reader.get_string_list("axis-map");
        std::vector<int> mapping;
        
        for(std::vector<std::string>::const_iterator i = cfg_axis_map.begin(); i != cfg_axis_map.end(); ++i)
          {
            int type = 0;
            int code = 0;
            str2event(*i, type, code);
            mapping.push_back(code);
          }

        set_axis_mapping(mapping);
      }

      { // Read button mapping
        const std::vector<std::string>& cfg_button_map = root_reader.get_string_list("button-map");
        std::vector<int> mapping;
        
        for(std::vector<std::string>::const_iterator i = cfg_button_map.begin(); i != cfg_button_map.end(); ++i)
          {
            int type = 0;
            int code = 0;
            str2event(*i, type, code);
            mapping.push_back(code);
          }

        set_button_mapping(mapping);
      }
    }
}
Example #2
0
static bool fill_joystick_axes(ALLEGRO_JOYSTICK_LINUX *joy, int fd)
{
    unsigned long abs_bits[NLONGS(ABS_CNT)] = {0};
    int stick;
    int axis;
    int name_sticks;
    int name_throttles;
    int res, i;

    /* Scan the axes to get their properties. */
    res = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(abs_bits)), abs_bits);
    if (res < 0)
        return false;

    stick = 0;
    axis = 0;
    name_sticks = 0;
    name_throttles = 0;

    for (i = LJOY_AXIS_RANGE_START; i < LJOY_AXIS_RANGE_END; i++) {
        struct input_absinfo absinfo;

        if (!TEST_BIT(i, abs_bits))
            continue;

        if (ioctl(fd, EVIOCGABS(i), &absinfo) < 0)
            continue;

        if (is_single_axis_throttle(i)) {
            /* One axis throttle. */
            name_throttles++;
            joy->parent.info.stick[stick].flags = ALLEGRO_JOYFLAG_ANALOGUE;
            joy->parent.info.stick[stick].num_axes = 1;
            joy->parent.info.stick[stick].axis[0].name = "X";
            joy->parent.info.stick[stick].name = al_malloc(32);
            snprintf((char *)joy->parent.info.stick[stick].name, 32,
                     "Throttle %d", name_throttles);
            set_axis_mapping(&joy->axis_mapping[i], stick, 0, &absinfo);
            stick++;
        }
        else {
            /* Regular axis, two axis stick. */
            if (axis == 0) {
                /* First axis of new joystick. */
                name_sticks++;
                if (is_hat_axis(i)) {
                    joy->parent.info.stick[stick].flags = ALLEGRO_JOYFLAG_DIGITAL;
                } else {
                    joy->parent.info.stick[stick].flags = ALLEGRO_JOYFLAG_ANALOGUE;
                }
                joy->parent.info.stick[stick].num_axes = 2;
                joy->parent.info.stick[stick].axis[0].name = "X";
                joy->parent.info.stick[stick].axis[1].name = "Y";
                joy->parent.info.stick[stick].name = al_malloc(32);
                snprintf((char *)joy->parent.info.stick[stick].name, 32,
                         "Stick %d", name_sticks);
                set_axis_mapping(&joy->axis_mapping[i], stick, axis, &absinfo);
                axis++;
            }
            else {
                /* Second axis. */
                ASSERT(axis == 1);
                set_axis_mapping(&joy->axis_mapping[i], stick, axis, &absinfo);
                stick++;
                axis = 0;
            }
        }
    }

    joy->parent.info.num_sticks = stick;

    return true;
}