int osd_is_joy_pressed(int joycode) { int joy_num,stick; /* special case for mouse buttons */ switch (joycode) { case MOUSE_BUTTON(1): return ExKey1 & GP2X_B; break; case MOUSE_BUTTON(2): return ExKey1 & GP2X_X; break; case MOUSE_BUTTON(3): return ExKey1 & GP2X_A; break; } joy_num = GET_JOYCODE_JOY(joycode); /* do we have as many sticks? */ if (joy_num == 0 || joy_num > num_joysticks) return 0; joy_num--; stick = GET_JOYCODE_STICK(joycode); if (stick == 0) { /* buttons */ int button; button = GET_JOYCODE_BUTTON(joycode); if (button == 0 || button > 6) return 0; button--; switch (joy_num) { case 0: return is_joy_button_pressed(button, ExKey1); break; case 1: return is_joy_button_pressed(button, ExKey2); break; case 2: return is_joy_button_pressed(button, ExKey3); break; case 3: return is_joy_button_pressed(button, ExKey4); break; default: break; } } else { /* sticks */ int axis,dir; if (stick > 1) return 0; stick--; axis = GET_JOYCODE_AXIS(joycode); dir = GET_JOYCODE_DIR(joycode); if (axis == 0 || axis > 2) return 0; axis--; switch (joy_num) { case 0: return is_joy_axis_pressed(axis, dir, ExKey1); break; case 1: return is_joy_axis_pressed(axis, dir, ExKey2); break; case 2: return is_joy_axis_pressed(axis, dir, ExKey3); break; case 3: return is_joy_axis_pressed(axis, dir, ExKey4); break; default: break; } } return 0; }
static int DIJoystick_is_joy_pressed(int joycode) { int joy_num; int stick; int axis; int dir; DIJOYSTATE dijs; int value; int dz = 60; joy_num = GET_JOYCODE_JOY(joycode); /* do we have as many sticks? */ if (joy_num == 0 || This.num_joysticks < joy_num) return 0; joy_num--; if (This.joysticks[joy_num].use_joystick == FALSE) return 0; dijs = This.joysticks[joy_num].dijs; stick = GET_JOYCODE_STICK(joycode); if (stick == JOYCODE_STICK_BTN) { /* buttons */ int button; button = GET_JOYCODE_BUTTON(joycode); button--; if (button >= This.joysticks[joy_num].num_buttons || GET_JOYCODE_DIR(joycode) != JOYCODE_DIR_BTN) return 0; return dijs.rgbButtons[button] != 0; } if (stick == JOYCODE_STICK_POV) { /* POV */ int pov_value; int angle; int axis_value; int num_pov = GET_JOYCODE_BUTTON(joycode) / 4; int code = GET_JOYCODE_BUTTON(joycode) % 4; axis = code / 2; dir = code % 2; if (num_pov >= This.joysticks[joy_num].num_pov) return 0; pov_value = dijs.rgdwPOV[num_pov]; if (LOWORD(pov_value) == 0xffff) return 0; angle = (pov_value + 27000) % 36000; angle = (36000 - angle) % 36000; angle /= 100; /* angle is now in degrees counterclockwise from x axis*/ if (axis == 1) axis_value = 128 + (int)(127 * cos(2 * M_PI * angle / 360.0)); /* x */ else axis_value = 128 + (int)(127 * sin(2 * M_PI * angle / 360.0)); /* y */ if (dir == 1) return axis_value <= (128 - 128 * dz / 100); else return axis_value >= (128 + 128 * dz / 100); } /* sticks */ axis = GET_JOYCODE_AXIS(joycode); dir = GET_JOYCODE_DIR(joycode); if (axis == 0 || This.joysticks[joy_num].num_axes < axis) return 0; axis--; value = *(int *)(((byte *)&dijs) + This.joysticks[joy_num].axes[axis].offset); if (dir == JOYCODE_DIR_NEG) return value <= (128 - 128 * dz / 100); else return value >= (128 + 128 * dz / 100); }