// SPDX-License-Identifier: GPL-2.0-only #include "gxfp/device.h" #include "gxfp/fdt.h" #include "gxfp/protocol.h" #include #include #include #include #include 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; }