Initial GXFP5130 userspace prototype
This commit is contained in:
99
examples/fdt-monitor.c
Normal file
99
examples/fdt-monitor.c
Normal file
@@ -0,0 +1,99 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
#include "gxfp/device.h"
|
||||
#include "gxfp/fdt.h"
|
||||
#include "gxfp/protocol.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static const char *event_name(enum gxfp_fdt_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case GXFP_FDT_EVENT_READY:
|
||||
return "ready";
|
||||
case GXFP_FDT_EVENT_FINGER_DOWN:
|
||||
return "finger-down";
|
||||
case GXFP_FDT_EVENT_FINGER_UP:
|
||||
return "finger-up";
|
||||
case GXFP_FDT_EVENT_REVERSE:
|
||||
return "reverse";
|
||||
default:
|
||||
return "none";
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *path = argc > 1 ? argv[1] : "/dev/gxfp";
|
||||
struct gxfp_device device = { .fd = -1 };
|
||||
struct gxfp_fdt fdt;
|
||||
int ret;
|
||||
|
||||
ret = gxfp_device_open(&device, path);
|
||||
if (ret) {
|
||||
fprintf(stderr, "open failed: %s\n", strerror(-ret));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
ret = gxfp_device_flush_rx(&device);
|
||||
if (ret)
|
||||
fprintf(stderr, "warning: flush failed: %s\n", strerror(-ret));
|
||||
|
||||
gxfp_fdt_init(&fdt);
|
||||
|
||||
ret = gxfp_fdt_arm_down(&device);
|
||||
if (ret) {
|
||||
fprintf(stderr, "FDT arm failed: %s\n", strerror(-ret));
|
||||
gxfp_device_close(&device);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
printf("FDT monitor active. Touch and release the sensor.\n");
|
||||
|
||||
for (;;) {
|
||||
struct gxfp_rx_record record;
|
||||
struct gxfp_frame_view frame;
|
||||
enum gxfp_fdt_event event;
|
||||
uint16_t status = 0;
|
||||
|
||||
ret = gxfp_device_receive(&device, &record, -1);
|
||||
if (ret == -EINTR)
|
||||
break;
|
||||
if (ret) {
|
||||
fprintf(stderr, "receive failed: %s\n", strerror(-ret));
|
||||
break;
|
||||
}
|
||||
|
||||
ret = gxfp_frame_parse(record.payload, record.payload_len, &frame);
|
||||
if (ret) {
|
||||
fprintf(stderr, "bad frame: %s\n", strerror(-ret));
|
||||
gxfp_rx_record_release(&record);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (frame.command == GXFP_GOODIX_ACK) {
|
||||
gxfp_rx_record_release(&record);
|
||||
continue;
|
||||
}
|
||||
|
||||
event = gxfp_fdt_decode(&frame, &status);
|
||||
|
||||
printf("cmd=0x%02x status=0x%04x event=%s\n",
|
||||
frame.command, status, event_name(event));
|
||||
|
||||
ret = gxfp_fdt_handle_event(&fdt, &device, event);
|
||||
gxfp_rx_record_release(&record);
|
||||
|
||||
if (ret) {
|
||||
fprintf(stderr, "FDT transition failed: %s\n",
|
||||
strerror(-ret));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gxfp_device_close(&device);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Reference in New Issue
Block a user