Files

100 lines
2.1 KiB
C

// 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;
}