#include "input_mapper.h" #include "usb_device.h" #include "touch_controls_all.h" namespace InputMapper { USB_Device device; TouchJoystick tjoystick_right; TouchJoystick tjoystick_left; TouchDpad tdpad_right; TouchDpad tdpad_left; TouchControl* tcontrols[2][2] = { { &tjoystick_left, &tdpad_left, }, { &tjoystick_right, &tdpad_right, } }; const uint8_t num_controls = sizeof(tcontrols) / sizeof(TouchControl*[2]); void begin() { float ppmX = 1872 / 62.5; float ppmY = 3276 / 103.9; int32_t pos_x = 31.25 * ppmX; int32_t pos_y = (103.9 - 31.25) * ppmY; int32_t pos_r = 70 * ppmX / 2; int32_t dead_zone_inner = 3 * ppmX; int32_t dead_zone_outer = 20 * ppmX; tjoystick_left.init(pos_x, pos_y, pos_r, USB_Device::usb_joystick_x, USB_Device::usb_joystick_y, USB_Device::usb_joystick_r); tjoystick_left.setDeadZoneInner(dead_zone_inner); tjoystick_left.setDeadZoneOuter(dead_zone_outer); pos_x = 31.25 * ppmX; pos_y = (103.9 - 31.25) * ppmY; tjoystick_right.init(pos_x, pos_y, pos_r, USB_Device::usb_joystick_x, USB_Device::usb_joystick_y, USB_Device::usb_joystick_r); tjoystick_right.setDeadZoneInner(dead_zone_inner); tjoystick_right.setDeadZoneOuter(dead_zone_outer); pos_x = 20.636 * ppmX; pos_y = 20.636 * ppmY; pos_r = 45 * ppmX / 2; tdpad_right.init(pos_x, pos_y, pos_r, TouchDpad::DPAD_TYPE_SECTOR4); tdpad_right.setDeadZoneInner(dead_zone_inner); pos_x = (62.5 - 20.636) * ppmX; pos_y = 20.636 * ppmY; tdpad_left.init(pos_x, pos_y, pos_r, TouchDpad::DPAD_TYPE_SECTOR4); tdpad_left.setDeadZoneInner(dead_zone_inner); device.begin(); } uint16_t dpad_map[][4] = { { USB_Device::DPAD_UP, USB_Device::DPAD_DOWN, USB_Device::DPAD_LEFT, USB_Device::DPAD_RIGHT, }, { USB_Device::FACE_Y, USB_Device::FACE_A, USB_Device::FACE_X, USB_Device::FACE_B, }, }; uint16_t mapDpad(uint8_t dpad, uint8_t direction) { uint16_t button = 0; for (uint8_t i = 0; i < 4; ++i) { if (direction & (1 << i)) { button |= dpad_map[dpad][i]; } } return button; } void mapTrackpad(uint8_t id, uint8_t fid, int32_t x, int32_t y) { for (uint8_t c = 0; c < num_controls; ++c) { int res; switch(tcontrols[id][c]->getControlType()) { case TouchControl::CT_NONE: break; case TouchControl::CT_JOYSTICK: res = tcontrols[id][c]->touch(fid, x, y); device.joystick(id, ((TouchJoystick*)tcontrols[id][c])->getX(), ((TouchJoystick*)tcontrols[id][c])->getY()); break; case TouchControl::CT_DPAD: { uint16_t prev_button = mapDpad(id, ((TouchDpad*)tcontrols[id][c])->getButton()); device.button(prev_button, 0); res = tcontrols[id][c]->touch(fid, x, y); uint16_t button = mapDpad(id, ((TouchDpad*)tcontrols[id][c])->getButton()); device.button(button, button); } break; } // if control is touched return if (res > 0) { return; } } } void mapTriggers(uint32_t value[2]) { static const uint32_t max = 70; static const uint32_t min = 2; uint8_t mapped_value[2]; for (uint8_t i = 0; i < 2; ++i) { if (value[i] < min) { mapped_value[i] = 0; } else if (value[i] > max) { mapped_value[i] = 255; } else { mapped_value[i] = (value[i] - min) * 255 / (max - min); } } device.triggers(mapped_value); } uint16_t button_map[] = { USB_Device::START, USB_Device::SELECT, USB_Device::JOYSTICK_LEFT, USB_Device::JOYSTICK_RIGHT, USB_Device::BUMPER_LEFT, USB_Device::BUMPER_RIGHT, USB_Device::HOME, USB_Device::FACE_A, USB_Device::FACE_B, USB_Device::FACE_X, USB_Device::FACE_Y, }; void mapButton(HardwareButtons button, bool value) { device.button(button_map[button], value? button_map[button] : 0); } void sendReport() { device.sendReport(); } }