mirror of
https://github.com/NepEgor/OpenTrackpadController.git
synced 2024-11-15 18:12:46 +00:00
Handling input events from the trackpads
This commit is contained in:
parent
1aab181022
commit
5d4c0ad2f3
@ -22,6 +22,8 @@ class TouchControl
|
||||
|
||||
ControlType control_type;
|
||||
|
||||
int8_t finger_id;
|
||||
|
||||
public:
|
||||
|
||||
TouchControl() {}
|
||||
@ -29,7 +31,7 @@ class TouchControl
|
||||
|
||||
virtual void init(int32_t pos_x, int32_t pos_y, int32_t pos_r);
|
||||
|
||||
virtual int8_t touch(int32_t tx, int32_t ty) = 0;
|
||||
virtual int8_t touch(int8_t fid, int32_t tx, int32_t ty) = 0;
|
||||
|
||||
ControlType getControlType() {return control_type;}
|
||||
};
|
||||
|
@ -41,7 +41,7 @@ class TouchDpad : public TouchControl
|
||||
void setInvertX(bool invert_x = true);
|
||||
void setInvertY(bool invert_y = true);
|
||||
|
||||
int8_t touch(int32_t tx, int32_t ty);
|
||||
int8_t touch(int8_t fid, int32_t tx, int32_t ty);
|
||||
|
||||
uint8_t getButton() {return button;}
|
||||
};
|
||||
|
@ -39,7 +39,7 @@ class TouchJoystick : public TouchControl
|
||||
void setInvertX(bool invert_x = true);
|
||||
void setInvertY(bool invert_y = true);
|
||||
|
||||
int8_t touch(int32_t tx, int32_t ty);
|
||||
int8_t touch(int8_t fid, int32_t tx, int32_t ty);
|
||||
|
||||
int16_t getX() {return x;}
|
||||
int16_t getY() {return y;}
|
||||
|
@ -13,4 +13,6 @@ void TouchControl::init(int32_t pos_x, int32_t pos_y, int32_t pos_r)
|
||||
this->pos_r2 = pos_r * pos_r;
|
||||
|
||||
this->control_type = CT_NONE;
|
||||
|
||||
this->finger_id = -1;
|
||||
}
|
||||
|
@ -45,8 +45,13 @@ void TouchDpad::setInvertY(bool invert_y)
|
||||
this->invert_y = invert_y ? -1 : 1;
|
||||
}
|
||||
|
||||
int8_t TouchDpad::touch(int32_t tx, int32_t ty)
|
||||
int8_t TouchDpad::touch(int8_t fid, int32_t tx, int32_t ty)
|
||||
{
|
||||
if (finger_id != -1 && finger_id != fid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t ret = 2;
|
||||
|
||||
tx -= pos_x;
|
||||
@ -59,61 +64,66 @@ int8_t TouchDpad::touch(int32_t tx, int32_t ty)
|
||||
// outside the range
|
||||
if (t2 > pos_r2)
|
||||
{
|
||||
ret = 0;
|
||||
finger_id = -1;
|
||||
return 0;
|
||||
}
|
||||
else // inside inner dead_zone
|
||||
if (t2 < dead_zone_inner2)
|
||||
{
|
||||
ret = 1;
|
||||
}
|
||||
else // in bounds
|
||||
{
|
||||
button = 0;
|
||||
|
||||
switch (dpad_type)
|
||||
finger_id = fid;
|
||||
|
||||
if (t2 < dead_zone_inner2)
|
||||
{
|
||||
case DPAD_TYPE_SECTOR4:
|
||||
button |= (invert_y * ty > invert_x * -tx);
|
||||
button |= (invert_y * ty > invert_x * tx) << 1;
|
||||
ret = 1;
|
||||
}
|
||||
else // in bounds
|
||||
{
|
||||
button = 0;
|
||||
|
||||
switch (dpad_type)
|
||||
{
|
||||
case DPAD_TYPE_SECTOR4:
|
||||
button |= (invert_y * ty > invert_x * -tx);
|
||||
button |= (invert_y * ty > invert_x * tx) << 1;
|
||||
|
||||
switch (button)
|
||||
{
|
||||
case 0b00: button = 0; break;
|
||||
case 0b01: button = 2; break;
|
||||
case 0b11: button = 4; break;
|
||||
case 0b10: button = 6; break;
|
||||
|
||||
default: button = NOT_PRESSED; break;
|
||||
}
|
||||
switch (button)
|
||||
{
|
||||
case 0b00: button = 0; break;
|
||||
case 0b01: button = 2; break;
|
||||
case 0b11: button = 4; break;
|
||||
case 0b10: button = 6; break;
|
||||
|
||||
default: button = NOT_PRESSED; break;
|
||||
}
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case DPAD_TYPE_SECTOR8:
|
||||
button |= (invert_y * ty > invert_x * -tx * k2);
|
||||
button |= (invert_y * ty > invert_x * -tx * k1) << 1;
|
||||
button |= (invert_y * ty > invert_x * tx * k1) << 2;
|
||||
button |= (invert_y * ty > invert_x * tx * k2) << 3;
|
||||
case DPAD_TYPE_SECTOR8:
|
||||
button |= (invert_y * ty > invert_x * -tx * k2);
|
||||
button |= (invert_y * ty > invert_x * -tx * k1) << 1;
|
||||
button |= (invert_y * ty > invert_x * tx * k1) << 2;
|
||||
button |= (invert_y * ty > invert_x * tx * k2) << 3;
|
||||
|
||||
switch (button)
|
||||
{
|
||||
case 0: button = 0; break;
|
||||
case 1: button = 1; break;
|
||||
case 3: button = 2; break;
|
||||
case 7: button = 3; break;
|
||||
case 15: button = 4; break;
|
||||
case 14: button = 5; break;
|
||||
case 12: button = 6; break;
|
||||
case 8: button = 7; break;
|
||||
|
||||
default: button = NOT_PRESSED; break;
|
||||
}
|
||||
switch (button)
|
||||
{
|
||||
case 0: button = 0; break;
|
||||
case 1: button = 1; break;
|
||||
case 3: button = 2; break;
|
||||
case 7: button = 3; break;
|
||||
case 15: button = 4; break;
|
||||
case 14: button = 5; break;
|
||||
case 12: button = 6; break;
|
||||
case 8: button = 7; break;
|
||||
|
||||
default: button = NOT_PRESSED; break;
|
||||
}
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
@ -52,44 +52,54 @@ void TouchJoystick::setInvertY(bool invert_y)
|
||||
this->invert_y = invert_y;
|
||||
}
|
||||
|
||||
int8_t TouchJoystick::touch(int32_t tx, int32_t ty)
|
||||
int8_t TouchJoystick::touch(int8_t fid, int32_t tx, int32_t ty)
|
||||
{
|
||||
if (finger_id != -1 && finger_id != fid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t ret = 2;
|
||||
|
||||
tx -= pos_x;
|
||||
ty -= pos_y;
|
||||
|
||||
int32_t t2 = tx * tx + ty * ty;
|
||||
|
||||
x = usb_x;
|
||||
y = usb_y;
|
||||
|
||||
int32_t t2 = tx * tx + ty * ty;
|
||||
|
||||
// outside the range
|
||||
if (t2 > pos_r2)
|
||||
{
|
||||
ret = 0;
|
||||
finger_id = -1;
|
||||
return 0;
|
||||
}
|
||||
else // inside inner dead_zone
|
||||
if (t2 < dead_zone_inner2)
|
||||
{
|
||||
ret = 1;
|
||||
}
|
||||
else // between dead zones
|
||||
if (t2 <= dead_zone_outer2)
|
||||
{
|
||||
x = tx * pos2usb + usb_x;
|
||||
y = ty * pos2usb + usb_y;
|
||||
}
|
||||
else // in bounds outside of outer dead zone
|
||||
{
|
||||
float len = sqrt(t2);
|
||||
finger_id = fid;
|
||||
|
||||
x = (tx * dead_zone_outer / len) * pos2usb + usb_x;
|
||||
y = (ty * dead_zone_outer / len) * pos2usb + usb_y;
|
||||
if (t2 < dead_zone_inner2)
|
||||
{
|
||||
ret = 1;
|
||||
}
|
||||
else // between dead zones
|
||||
if (t2 <= dead_zone_outer2)
|
||||
{
|
||||
x = tx * pos2usb + usb_x;
|
||||
y = ty * pos2usb + usb_y;
|
||||
}
|
||||
else // in bounds outside of outer dead zone
|
||||
{
|
||||
float len = sqrt(t2);
|
||||
|
||||
x = (tx * dead_zone_outer / len) * pos2usb + usb_x;
|
||||
y = (ty * dead_zone_outer / len) * pos2usb + usb_y;
|
||||
}
|
||||
|
||||
if (invert_x) x = usb_x + usb_r - x;
|
||||
if (invert_y) y = usb_y + usb_r - y;
|
||||
}
|
||||
|
||||
if (invert_x) x = usb_x + usb_r - x;
|
||||
if (invert_y) y = usb_y + usb_r - y;
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
97
src/main.cpp
97
src/main.cpp
@ -84,60 +84,73 @@ void setup()
|
||||
digitalWrite(PC13, HIGH);
|
||||
}
|
||||
|
||||
uint8_t tevent_size;
|
||||
TouchEvent tevent[5];
|
||||
|
||||
void loop()
|
||||
{
|
||||
uint32_t right_trigger = analogRead(TRIGGER_RIGHT_PIN);
|
||||
uint8_t right_tp_click = digitalRead(TRACKPAD_CLICK_RIGHT_PIN);
|
||||
|
||||
FingerPosition* fp;
|
||||
int8_t fingers_touching = trackpad_right.poll(&fp);
|
||||
if (fingers_touching > 0)
|
||||
int8_t ret = trackpad_right.poll(tevent, tevent_size);
|
||||
|
||||
if (ret > 0)
|
||||
{
|
||||
if (fp != NULL)
|
||||
for (uint8_t i = 0; i < tevent_size; ++i)
|
||||
{
|
||||
for (int8_t id = 0; id < TrackPad::fingers_num; ++id)
|
||||
int32_t x = -1;
|
||||
int32_t y = -1;
|
||||
switch (tevent[i].type)
|
||||
{
|
||||
if (fingers_touching & (1 << id))
|
||||
case TET_DOWN:
|
||||
case TET_MOVE:
|
||||
|
||||
x = tevent[i].fp.x;
|
||||
y = tevent[i].fp.y;
|
||||
|
||||
break;
|
||||
|
||||
case TET_UP:
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//Serial.printf("%u\n", tevent[i].type);
|
||||
|
||||
for (uint8_t c = 0; c < num_controls; ++c)
|
||||
{
|
||||
int8_t res = tcontrols[c]->touch(tevent[i].finger_id, y, x);
|
||||
if (res < 0)
|
||||
{
|
||||
for (uint8_t c = 0; c < num_controls; ++c)
|
||||
{
|
||||
int8_t res = tcontrols[c]->touch(fp[id].y, fp[id].x);
|
||||
if (res < 0)
|
||||
{
|
||||
Serial.printf("Impossible Error\n");
|
||||
break;
|
||||
}
|
||||
|
||||
switch(tcontrols[c]->getControlType())
|
||||
{
|
||||
case TouchControl::CT_NONE:
|
||||
Serial.printf("Control type not set\n");
|
||||
break;
|
||||
Serial.printf("Impossible Error\n");
|
||||
break;
|
||||
}
|
||||
|
||||
switch(tcontrols[c]->getControlType())
|
||||
{
|
||||
case TouchControl::CT_NONE:
|
||||
Serial.printf("Control type not set\n");
|
||||
break;
|
||||
|
||||
case TouchControl::CT_JOYSTICK:
|
||||
device.joystick_left(((TouchJoystick*)tcontrols[c])->getX(), ((TouchJoystick*)tcontrols[c])->getY());
|
||||
break;
|
||||
|
||||
case TouchControl::CT_DPAD:
|
||||
device.dpad(((TouchDpad*)tcontrols[c])->getButton());
|
||||
break;
|
||||
}
|
||||
case TouchControl::CT_JOYSTICK:
|
||||
device.joystick_left(((TouchJoystick*)tcontrols[c])->getX(), ((TouchJoystick*)tcontrols[c])->getY());
|
||||
break;
|
||||
|
||||
case TouchControl::CT_DPAD:
|
||||
device.dpad(((TouchDpad*)tcontrols[c])->getButton());
|
||||
break;
|
||||
}
|
||||
|
||||
if (res > 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (res > 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if (fingers_touching == 0)
|
||||
{
|
||||
device.joystick_left(USB_Device::usb_joystick_x, USB_Device::usb_joystick_y);
|
||||
device.dpad(TouchDpad::NOT_PRESSED);
|
||||
}
|
||||
|
||||
uint32_t right_trigger = analogRead(TRIGGER_RIGHT_PIN);
|
||||
uint8_t right_tp_click = digitalRead(TRACKPAD_CLICK_RIGHT_PIN);
|
||||
|
||||
device.trigger_right(right_trigger);
|
||||
device.button(0, right_tp_click);
|
||||
|
Loading…
Reference in New Issue
Block a user