Esempio n. 1
0
static void read_joy (unsigned int num)
{
    struct joystick *joy = &joystickList[num];

    if (joy->handle) {
	void *buffer;

	/*
	 * Poll device for data
	 */
	if (AIN_ReadDevice (joy->context, joy->handle, &buffer)) {
	    unsigned int i;

	    /* Extract axis data from buffer and notify UAE of any changes
	     * in axis state
	     */
	    for (i = 0; i < joy->axisCount; i++) {
		int axisdata = BUFFER_OFFSET (buffer, joy->axisBufferOffset[i]);

		if (axisdata != joy->axisData[i]) {
		    setjoystickstate (num, i, axisdata, 32767);
		    joy->axisData[i] = axisdata;
		}
	    }

	    /* Extract button data from buffer and notify SDL of any changes
	     * in button state
	     *
	     * Note: We don't support analog buttons.
	     */
	    for (i = 0; i < joy->buttonCount; i++) {
		int buttondata = BUFFER_OFFSET (buffer, joy->buttonBufferOffset[i]);

		if (buttondata != joy->buttonData[i]) {
		    setjoybuttonstate (num, i, buttondata ? 1 : 0);
		    joy->buttonData[i] = buttondata;
		}
	    }

	}
    }
}
Esempio n. 2
0
int joyai_update(int joy, int dst)
{
    void *ptr;
    keysym_type *keysym = (joy == 2) ? keysym_2 : keysym_1;
    BYTE value = 0;

    if (!amigainput_lib_loaded) {
        return -1;
    }

    if ((CTX == NULL) || (ai_handle[joy - 1] == NULL)) {
        return -1;
    }

    if (AIN_ReadDevice(CTX, ai_handle[joy - 1], &ptr) == TRUE) {
        unsigned int i, *data = ptr;

        for (i = 0; i < NUM_KEYSYM; i++) {
            switch (keysym[i].type) {

                /* Axis and hats use values between -32768 and 32767. Digital Buttons use
                 * values between 0 and 1 (1 is "pressed"), while analog buttons use
                 * values between 0 and 32767.
                 */
                case TYPE_BUTTON:
                    value = (1 << keysym[i].bitnum);
                    if (data[keysym[i].offset]) {
                        joystick_set_value_or(dst, value);
                    } else {
                        joystick_set_value_and(dst, (BYTE) ~value);
                    }
                    break;
                case TYPE_AXES:
                    value = (1 << keysym[i].bitnum);
                    switch (keysym[i].bitnum) {
                        case DIGITAL_UP: /* neg value */
                        case DIGITAL_LEFT: /* neg value */
                            if (data[keysym[i].offset] <= (-(ONOFF_VALUE))) {
                                joystick_set_value_or(dst, value);
                            } else {
                                joystick_set_value_and(dst, (BYTE) ~value);
                            }
                            break;
                        case DIGITAL_DOWN: /* pos value */
                        case DIGITAL_RIGHT: /* pos value */
                            if (data[keysym[i].offset] >= (ONOFF_VALUE)) {
                                joystick_set_value_or(dst, value);
                            } else {
                                joystick_set_value_and(dst, (BYTE) ~value);
                            }
                            break;
                        default:
                            break;
                    }
                    break;
                case TYPE_HAT:
                    value = 0;
                    switch (data[keysym[i].offset]) {
                        case 1: /* N */
                            value = (1 << DIGITAL_UP);
                            break;
                        case 2: /* NE */
                            value = ((1 << DIGITAL_UP) | (1 << DIGITAL_RIGHT));
                            break;
                        case 3: /* E */
                            value = (1 << DIGITAL_RIGHT);
                            break;
                        case 4: /* SE */
                            value = ((1 << DIGITAL_DOWN) | (1 << DIGITAL_RIGHT));
                            break;
                        case 5: /* S */
                            value = (1 << DIGITAL_DOWN);
                            break;
                        case 6: /* SW */
                            value = ((1 << DIGITAL_DOWN) | (1 << DIGITAL_LEFT));
                            break;
                        case 7: /* W */
                            value = (1 << DIGITAL_LEFT);
                            break;
                        case 8: /* NW */
                            value = ((1 << DIGITAL_UP) | (1 << DIGITAL_LEFT));
                            break;
                        default: /* none */
                            break;
                    }

                    joystick_set_value_absolute(dst, value);
                    break;
                default:
                    break;
            }
        }

        return 0;
    }

    return -1;
}