Add Buttons to Setsu

This commit is contained in:
Florian Märkl 2020-07-03 18:18:50 +02:00
commit abec268ab6
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
3 changed files with 112 additions and 46 deletions

View file

@ -90,7 +90,7 @@ void event(SetsuEvent *event, void *user)
case SETSU_EVENT_DEVICE_REMOVED: case SETSU_EVENT_DEVICE_REMOVED:
LOG("Device removed: %s\n", event->path); LOG("Device removed: %s\n", event->path);
break; break;
case SETSU_EVENT_DOWN: case SETSU_EVENT_TOUCH_DOWN:
LOG("Down for %s, tracking id %d\n", setsu_device_get_path(event->dev), event->tracking_id); LOG("Down for %s, tracking id %d\n", setsu_device_get_path(event->dev), event->tracking_id);
for(size_t i=0; i<TOUCHES_MAX; i++) for(size_t i=0; i<TOUCHES_MAX; i++)
{ {
@ -102,9 +102,9 @@ void event(SetsuEvent *event, void *user)
} }
} }
break; break;
case SETSU_EVENT_POSITION: case SETSU_EVENT_TOUCH_POSITION:
case SETSU_EVENT_UP: case SETSU_EVENT_TOUCH_UP:
if(event->type == SETSU_EVENT_UP) if(event->type == SETSU_EVENT_TOUCH_UP)
LOG("Up for %s, tracking id %d\n", setsu_device_get_path(event->dev), event->tracking_id); LOG("Up for %s, tracking id %d\n", setsu_device_get_path(event->dev), event->tracking_id);
else else
LOG("Position for %s, tracking id %d: %u, %u\n", setsu_device_get_path(event->dev), LOG("Position for %s, tracking id %d: %u, %u\n", setsu_device_get_path(event->dev),
@ -115,11 +115,11 @@ void event(SetsuEvent *event, void *user)
{ {
switch(event->type) switch(event->type)
{ {
case SETSU_EVENT_POSITION: case SETSU_EVENT_TOUCH_POSITION:
touches[i].x = event->x; touches[i].x = event->x;
touches[i].y = event->y; touches[i].y = event->y;
break; break;
case SETSU_EVENT_UP: case SETSU_EVENT_TOUCH_UP:
touches[i].down = false; touches[i].down = false;
break; break;
default: default:
@ -128,6 +128,11 @@ void event(SetsuEvent *event, void *user)
} }
} }
break; break;
case SETSU_EVENT_BUTTON_DOWN:
case SETSU_EVENT_BUTTON_UP:
LOG("Button for %s: %llu %s\n", setsu_device_get_path(event->dev),
(unsigned long long)event->button, event->type == SETSU_EVENT_BUTTON_DOWN ? "down" : "up");
break;
} }
} }

View file

@ -42,17 +42,27 @@ typedef enum {
/* Touch down. /* Touch down.
* Event will have dev and tracking_id set. */ * Event will have dev and tracking_id set. */
SETSU_EVENT_DOWN, SETSU_EVENT_TOUCH_DOWN,
/* Touch down. /* Touch down.
* Event will have dev and tracking_id set. */ * Event will have dev and tracking_id set. */
SETSU_EVENT_UP, SETSU_EVENT_TOUCH_UP,
/* Touch position update. /* Touch position update.
* Event will have dev, tracking_id, x and y set. */ * Event will have dev, tracking_id, x and y set. */
SETSU_EVENT_POSITION SETSU_EVENT_TOUCH_POSITION,
/* Event will have dev and button set. */
SETSU_EVENT_BUTTON_DOWN,
/* Event will have dev and button set. */
SETSU_EVENT_BUTTON_UP
} SetsuEventType; } SetsuEventType;
#define SETSU_BUTTON_0 (1u << 0)
typedef uint64_t SetsuButton;
typedef struct setsu_event_t typedef struct setsu_event_t
{ {
SetsuEventType type; SetsuEventType type;
@ -62,8 +72,15 @@ typedef struct setsu_event_t
struct struct
{ {
SetsuDevice *dev; SetsuDevice *dev;
SetsuTrackingId tracking_id; union
uint32_t x, y; {
struct
{
SetsuTrackingId tracking_id;
uint32_t x, y;
};
SetsuButton button;
};
}; };
}; };
} SetsuEvent; } SetsuEvent;

View file

@ -69,6 +69,9 @@ typedef struct setsu_device_t
bool pos_dirty; bool pos_dirty;
} slots[SLOTS_COUNT]; } slots[SLOTS_COUNT];
unsigned int slot_cur; unsigned int slot_cur;
uint64_t buttons_prev;
uint64_t buttons_cur;
} SetsuDevice; } SetsuDevice;
struct setsu_t struct setsu_t
@ -458,6 +461,17 @@ static void poll_device(Setsu *setsu, SetsuDevice *dev, SetsuEventCb cb, void *u
} }
} }
static uint64_t button_from_evdev(int key)
{
switch(key)
{
case BTN_LEFT:
return SETSU_BUTTON_0;
default:
return 0;
}
}
static void device_event(Setsu *setsu, SetsuDevice *dev, struct input_event *ev, SetsuEventCb cb, void *user) static void device_event(Setsu *setsu, SetsuDevice *dev, struct input_event *ev, SetsuEventCb cb, void *user)
{ {
#if 0 #if 0
@ -467,43 +481,57 @@ static void device_event(Setsu *setsu, SetsuDevice *dev, struct input_event *ev,
ev->value); ev->value);
#endif #endif
#define S dev->slots[dev->slot_cur] #define S dev->slots[dev->slot_cur]
if(ev->type == EV_ABS) switch(ev->type)
{ {
switch(ev->code) case EV_ABS:
{ switch(ev->code)
case ABS_MT_SLOT: {
if((unsigned int)ev->value >= SLOTS_COUNT) case ABS_MT_SLOT:
{ if((unsigned int)ev->value >= SLOTS_COUNT)
SETSU_LOG("slot too high\n"); {
SETSU_LOG("slot too high\n");
break;
}
dev->slot_cur = ev->value;
break; break;
} case ABS_MT_TRACKING_ID:
dev->slot_cur = ev->value; if(S.tracking_id != -1 && S.tracking_id_prev == -1)
break; {
case ABS_MT_TRACKING_ID: // up the tracking id
if(S.tracking_id != -1 && S.tracking_id_prev == -1) S.tracking_id_prev = S.tracking_id;
{ // reset the rest
// up the tracking id S.x = S.y = 0;
S.tracking_id_prev = S.tracking_id; S.pos_dirty = false;
// reset the rest }
S.x = S.y = 0; S.tracking_id = ev->value;
S.pos_dirty = false; if(ev->value != -1)
} S.downed = true;
S.tracking_id = ev->value; break;
if(ev->value != -1) case ABS_MT_POSITION_X:
S.downed = true; S.x = ev->value;
break; S.pos_dirty = true;
case ABS_MT_POSITION_X: break;
S.x = ev->value; case ABS_MT_POSITION_Y:
S.pos_dirty = true; S.y = ev->value;
break; S.pos_dirty = true;
case ABS_MT_POSITION_Y: break;
S.y = ev->value; }
S.pos_dirty = true; break;
case EV_KEY: {
uint64_t button = button_from_evdev(ev->code);
if(!button)
break; break;
if(ev->value)
dev->buttons_cur |= button;
else
dev->buttons_cur &= ~button;
break;
} }
case EV_SYN:
if(ev->code == SYN_REPORT)
device_drain(setsu, dev, cb, user);
break;
} }
else if(ev->type == EV_SYN && ev->code == SYN_REPORT)
device_drain(setsu, dev, cb, user);
#undef S #undef S
} }
@ -516,21 +544,21 @@ static void device_drain(Setsu *setsu, SetsuDevice *dev, SetsuEventCb cb, void *
{ {
if(dev->slots[i].tracking_id_prev != -1) if(dev->slots[i].tracking_id_prev != -1)
{ {
BEGIN_EVENT(SETSU_EVENT_UP); BEGIN_EVENT(SETSU_EVENT_TOUCH_UP);
event.tracking_id = dev->slots[i].tracking_id_prev; event.tracking_id = dev->slots[i].tracking_id_prev;
SEND_EVENT(); SEND_EVENT();
dev->slots[i].tracking_id_prev = -1; dev->slots[i].tracking_id_prev = -1;
} }
if(dev->slots[i].downed) if(dev->slots[i].downed)
{ {
BEGIN_EVENT(SETSU_EVENT_DOWN); BEGIN_EVENT(SETSU_EVENT_TOUCH_DOWN);
event.tracking_id = dev->slots[i].tracking_id; event.tracking_id = dev->slots[i].tracking_id;
SEND_EVENT(); SEND_EVENT();
dev->slots[i].downed = false; dev->slots[i].downed = false;
} }
if(dev->slots[i].pos_dirty) if(dev->slots[i].pos_dirty)
{ {
BEGIN_EVENT(SETSU_EVENT_POSITION); BEGIN_EVENT(SETSU_EVENT_TOUCH_POSITION);
event.tracking_id = dev->slots[i].tracking_id; event.tracking_id = dev->slots[i].tracking_id;
event.x = (uint32_t)(dev->slots[i].x - dev->min_x); event.x = (uint32_t)(dev->slots[i].x - dev->min_x);
event.y = (uint32_t)(dev->slots[i].y - dev->min_y); event.y = (uint32_t)(dev->slots[i].y - dev->min_y);
@ -538,6 +566,22 @@ static void device_drain(Setsu *setsu, SetsuDevice *dev, SetsuEventCb cb, void *
dev->slots[i].pos_dirty = false; dev->slots[i].pos_dirty = false;
} }
} }
uint64_t buttons_diff = dev->buttons_prev ^ dev->buttons_cur;
for(uint64_t i=0; i<64; i++)
{
if(buttons_diff & 1)
{
uint64_t button = 1 << i;
BEGIN_EVENT((dev->buttons_cur & button) ? SETSU_EVENT_BUTTON_DOWN : SETSU_EVENT_BUTTON_UP);
event.button = button;
SEND_EVENT();
}
buttons_diff >>= 1;
if(!buttons_diff)
break;
}
dev->buttons_prev = dev->buttons_cur;
#undef BEGIN_EVENT #undef BEGIN_EVENT
#undef SEND_EVENT #undef SEND_EVENT
} }