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