void PollForJoystickInput(int cpad) { int joyid = conf->get_joyid(cpad); if (!JoystickIdWithinBounds(joyid)) return; SDL_JoystickUpdate(); for (int i = 0; i < MAX_KEYS; i++) { JoystickInfo* pjoy = s_vjoysticks[joyid]; switch (type_of_joykey(cpad, i)) { case PAD_JOYBUTTONS: { int value = SDL_JoystickGetButton((pjoy)->GetJoy(), key_to_button(cpad, i)); if (value) key_status->press(cpad, i); else key_status->release(cpad, i); break; } case PAD_HAT: { int value = SDL_JoystickGetHat((pjoy)->GetJoy(), key_to_axis(cpad, i)); // key_to_hat_dir and SDL_JoystickGetHat are a 4 bits bitmap, one for each directions. Only 1 bit can be high for // key_to_hat_dir. SDL_JoystickGetHat handles diagonal too (2 bits) so you must check the intersection // '&' not only equality '=='. -- Gregory if (key_to_hat_dir(cpad, i) & value) key_status->press(cpad, i); else key_status->release(cpad, i); break; } case PAD_AXIS: { int value = pjoy->GetAxisFromKey(cpad, i); bool sign = key_to_axis_sign(cpad, i); bool full_axis = key_to_axis_type(cpad, i); if (IsAnalogKey(i)) { if (abs(value) > pjoy->GetDeadzone()) key_status->press(cpad, i, value); else key_status->release(cpad, i); } else { if (full_axis) { value += 0x8000; if (value > pjoy->GetDeadzone()) key_status->press(cpad, i, min(value/256 , 0xFF)); else key_status->release(cpad, i); } else { if (sign && (-value > pjoy->GetDeadzone())) key_status->press(cpad, i, min(-value /128, 0xFF)); else if (!sign && (value > pjoy->GetDeadzone())) key_status->press(cpad, i, min(value /128, 0xFF)); else key_status->release(cpad, i); } } } default: break; } } }
static void button_event(int key, bool pressed) { int new_btn = 0; static bool usb_connected = false; if (usb_connected && key != USB_KEY) return; switch (key) { case USB_KEY: if (!pressed) { usb_connected = !usb_connected; if (usb_connected) queue_post(&button_queue, SYS_USB_CONNECTED, 0); else queue_post(&button_queue, SYS_USB_DISCONNECTED, 0); } return; #if (CONFIG_PLATFORM & PLATFORM_PANDORA) case SDLK_LCTRL: /* Will post SDL_USEREVENT in shutdown_hw() if successful. */ sys_poweroff(); break; #endif #ifdef HAS_BUTTON_HOLD case SDLK_h: if(pressed) { hold_button_state = !hold_button_state; DEBUGF("Hold button is %s\n", hold_button_state?"ON":"OFF"); } return; #endif #ifdef HAS_REMOTE_BUTTON_HOLD case SDLK_j: if(pressed) { remote_hold_button_state = !remote_hold_button_state; DEBUGF("Remote hold button is %s\n", remote_hold_button_state?"ON":"OFF"); } return; #endif #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES) case SDLK_t: if(pressed) switch(_remote_type) { case REMOTETYPE_UNPLUGGED: _remote_type=REMOTETYPE_H100_LCD; DEBUGF("Changed remote type to H100\n"); break; case REMOTETYPE_H100_LCD: _remote_type=REMOTETYPE_H300_LCD; DEBUGF("Changed remote type to H300\n"); break; case REMOTETYPE_H300_LCD: _remote_type=REMOTETYPE_H300_NONLCD; DEBUGF("Changed remote type to H300 NON-LCD\n"); break; case REMOTETYPE_H300_NONLCD: _remote_type=REMOTETYPE_UNPLUGGED; DEBUGF("Changed remote type to none\n"); break; } break; #endif case SDLK_KP0: case SDLK_F5: if(pressed) { sim_trigger_screendump(); return; } break; #ifdef HAVE_TOUCHSCREEN case SDLK_F4: if(pressed) { touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT ? TOUCHSCREEN_BUTTON : TOUCHSCREEN_POINT); printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT ? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON"); } #endif default: #ifdef HAVE_TOUCHSCREEN new_btn = key_to_touch(key, mouse_coords); if (!new_btn) #endif new_btn = key_to_button(key); break; } /* Call to make up for scrollwheel target implementation. This is * not handled in the main button.c driver, but on the target * implementation (look at button-e200.c for example if you are trying to * figure out why using button_get_data needed a hack before). */ #if defined(BUTTON_SCROLL_FWD) && defined(BUTTON_SCROLL_BACK) if((new_btn == BUTTON_SCROLL_FWD || new_btn == BUTTON_SCROLL_BACK) && pressed) { /* Clear these buttons from the data - adding them to the queue is * handled in the scrollwheel drivers for the targets. They do not * store the scroll forward/back buttons in their button data for * the button_read call. */ #ifdef HAVE_BACKLIGHT backlight_on(); #endif #ifdef HAVE_BUTTON_LIGHT buttonlight_on(); #endif queue_post(&button_queue, new_btn, 1<<24); new_btn &= ~(BUTTON_SCROLL_FWD | BUTTON_SCROLL_BACK); } #endif if (pressed) btn |= new_btn; else btn &= ~new_btn; }
int button_read_device(void) { return key_to_button(r0_read_key()); }
EXPORT_C_(void) PADupdate(int pad) { // Poll keyboard. PollForKeyboardInput(pad); // joystick info SDL_JoystickUpdate(); for (int i = 0; i < MAX_KEYS; i++) { int cpad = PadEnum[pad][0]; if (JoystickIdWithinBounds(key_to_joystick_id(cpad, i))) { JoystickInfo* pjoy = s_vjoysticks[key_to_joystick_id(cpad, i)]; int pad = (pjoy)->GetPAD(); switch (type_of_key(cpad, i)) { case PAD_JOYBUTTONS: { int value = SDL_JoystickGetButton((pjoy)->GetJoy(), key_to_button(cpad, i)); if (value) clear_bit(status[pad], i); // released else set_bit(status[pad], i); // pressed break; } case PAD_HAT: { int value = SDL_JoystickGetHat((pjoy)->GetJoy(), key_to_axis(cpad, i)); if (key_to_hat_dir(cpad, i) == value) { clear_bit(status[pad], i); //PAD_LOG("Registered %s\n", HatName(value), i); //PAD_LOG("%s\n", KeyName(cpad, i).c_str()); } else { set_bit(status[pad], i); } break; } case PAD_POV: { int value = pjoy->GetAxisFromKey(cpad, i); PAD_LOG("%s: %d (%d)\n", KeyName(cpad, i).c_str(), value, key_to_pov_sign(cpad, i)); if (key_to_pov_sign(cpad, i) && (value < -2048)) { //PAD_LOG("%s Released+.\n", KeyName(cpad, i).c_str()); clear_bit(status[pad], i); } else if (!key_to_pov_sign(cpad, i) && (value > 2048)) { //PAD_LOG("%s Released-\n", KeyName(cpad, i).c_str()); clear_bit(status[pad], i); } else { //PAD_LOG("%s Pressed.\n", KeyName(cpad, i).c_str()); set_bit(status[pad], i); } break; } case PAD_JOYSTICK: { int value = pjoy->GetAxisFromKey(cpad, i); switch (i) { case PAD_LX: case PAD_LY: case PAD_RX: case PAD_RY: if (abs(value) > (pjoy)->GetDeadzone(value)) Analog::ConfigurePad(pad, i, value); else Analog::ResetPad(pad, i); break; } break; } default: break; } } } }
string KeyName(int pad, int key, int keysym) { string tmp; tmp.resize(28); if (keysym) { if (keysym < 10) { // mouse switch (keysym) { case 1: sprintf(&tmp[0], "Mouse Left"); break; case 2: sprintf(&tmp[0], "Mouse Middle"); break; case 3: sprintf(&tmp[0], "Mouse Right"); break; default: // Use only number for extra button sprintf(&tmp[0], "Mouse %d", keysym); } } else { // keyboard const char* pstr = PlatformKeysymToString(keysym); if (pstr != NULL) tmp = pstr; } } else { // joystick KeyType k = type_of_joykey(pad, key); switch (k) { case PAD_JOYBUTTONS: { int button = key_to_button(pad, key); sprintf(&tmp[0], "JBut %d", button); break; } case PAD_AXIS: { if (key_to_axis_type(pad,key)) sprintf(&tmp[0], "JAxis %d Full", key_to_axis(pad, key)); else sprintf(&tmp[0], "JAxis %d Half%s", key_to_axis(pad, key), key_to_axis_sign(pad, key) ? "-" : "+"); break; } case PAD_HAT: { int axis = key_to_axis(pad, key); switch(key_to_hat_dir(pad, key)) { case SDL_HAT_UP: sprintf(&tmp[0], "JPOVU-%d", axis); break; case SDL_HAT_RIGHT: sprintf(&tmp[0], "JPOVR-%d", axis); break; case SDL_HAT_DOWN: sprintf(&tmp[0], "JPOVD-%d", axis); break; case SDL_HAT_LEFT: sprintf(&tmp[0], "JPOVL-%d", axis); break; } break; } default: break; } } return tmp; }