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); } } }
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; }