Provide support for axis names.

x/y/z and pitch/yaw/roll (or p/y/r). Johnny's numbers still work, too, of
course.
This commit is contained in:
Bill Currie 2013-01-28 21:09:21 +09:00
parent 9a24c99cf6
commit bc2fa38468
2 changed files with 70 additions and 8 deletions

View file

@ -149,6 +149,7 @@ int JOY_GetOption_i (const char *c);
const char *JOY_GetDest_c (int i); const char *JOY_GetDest_c (int i);
int JOY_GetDest_i (const char *c); int JOY_GetDest_i (const char *c);
int JOY_GetAxis_i (int dest, const char *c);
void Joy_WriteBindings (QFile *f); void Joy_WriteBindings (QFile *f);

View file

@ -196,6 +196,11 @@ typedef struct {
js_dest_t optnum; js_dest_t optnum;
} js_opts_t; } js_opts_t;
typedef struct {
const char *name;
int axis;
} js_axis_t;
js_dests_t js_dests[] = { js_dests_t js_dests[] = {
{"none", js_none}, // ignore axis {"none", js_none}, // ignore axis
{"movement", js_position}, // linear delta {"movement", js_position}, // linear delta
@ -204,7 +209,6 @@ js_dests_t js_dests[] = {
{0, 0} {0, 0}
}; };
js_opts_t js_opts[] = { js_opts_t js_opts[] = {
{"clear", js_clear}, {"clear", js_clear},
{"amp", js_amp}, {"amp", js_amp},
@ -216,6 +220,30 @@ js_opts_t js_opts[] = {
{0, 0} {0, 0}
}; };
js_axis_t js_position_names[] = {
{"x", 0},
{"y", 1},
{"z", 2},
{0, 0}
};
js_axis_t js_angles_names[] = {
{"pitch", PITCH},
{"yaw", YAW},
{"roll", ROLL},
{"p", PITCH},
{"y", YAW},
{"r", ROLL},
{0, 0}
};
js_axis_t *js_axis_names[] = {
0, // js_none
js_position_names,
js_angles_names,
0, // js_button
};
const char * const char *
JOY_GetOption_c (int i) JOY_GetOption_c (int i)
{ {
@ -268,6 +296,28 @@ JOY_GetDest_i (const char *c)
return -1; // Failure code; return -1; // Failure code;
} }
int
JOY_GetAxis_i (int dest, const char *c)
{
char *end;
int axis;
js_axis_t *axis_names;
axis = strtol (c, &end, 10);
if (*end || axis < 0 || axis > 2) {
axis = -1;
for (axis_names = js_axis_names[dest]; axis_names && axis_names->name;
axis_names++) {
if (!strcasecmp (axis_names->name, c)) {
axis = axis_names->axis;
break;
}
}
}
return axis;
}
static void static void
in_joy_button_add_f (int ax, int index) in_joy_button_add_f (int ax, int index)
{ {
@ -389,8 +439,9 @@ in_joy_f (void)
break; break;
case js_type: case js_type:
joy_axes[ax].dest = JOY_GetDest_i (Cmd_Argv (i++)); joy_axes[ax].dest = JOY_GetDest_i (Cmd_Argv (i++));
joy_axes[ax].axis = strtol (Cmd_Argv (i++), NULL, 10); joy_axes[ax].axis = JOY_GetAxis_i (joy_axes[ax].dest,
if (joy_axes[ax].axis > 1 || joy_axes[ax].axis < 0) { Cmd_Argv (i++));
if (joy_axes[ax].axis > 2 || joy_axes[ax].axis < 0) {
joy_axes[ax].axis = 0; joy_axes[ax].axis = 0;
Sys_Printf ("Invalid axis value."); Sys_Printf ("Invalid axis value.");
} }
@ -440,11 +491,21 @@ Joy_WriteBindings (QFile * f)
int i; int i;
for (i = 0; i < JOY_MAX_AXES; i++) { for (i = 0; i < JOY_MAX_AXES; i++) {
Qprintf (f, "in_joy %i amp %.9g pre_amp %.9g deadzone %i " if (!js_axis_names[joy_axes[i].dest]) {
"offset %.9g type %s %i\n", Qprintf (f, "in_joy %i amp %.9g pre_amp %.9g deadzone %i "
i, joy_axes[i].amp, joy_axes[i].pre_amp, joy_axes[i].deadzone, "offset %.9g type %s %i\n",
joy_axes[i].offset, JOY_GetDest_c (joy_axes[i].dest), i, joy_axes[i].amp, joy_axes[i].pre_amp,
joy_axes[i].axis); joy_axes[i].deadzone,
joy_axes[i].offset, JOY_GetDest_c (joy_axes[i].dest),
joy_axes[i].axis);
} else {
Qprintf (f, "in_joy %i amp %.9g pre_amp %.9g deadzone %i "
"offset %.9g type %s %s\n",
i, joy_axes[i].amp, joy_axes[i].pre_amp,
joy_axes[i].deadzone,
joy_axes[i].offset, JOY_GetDest_c (joy_axes[i].dest),
js_axis_names[joy_axes[i].dest][joy_axes[i].axis].name);
}
if (joy_axes[i].num_buttons > 0) { if (joy_axes[i].num_buttons > 0) {
int n; int n;