mirror of https://github.com/nirenjan/libx52.git
102 lines
2.4 KiB
C
102 lines
2.4 KiB
C
/*
|
|
* Saitek X52 IO driver
|
|
*
|
|
* Copyright (C) 2012-2026 Nirenjan Krishnan (nirenjan@nirenjan.org)
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-only WITH Classpath-exception-2.0
|
|
*/
|
|
|
|
#include "build-config.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "common.h"
|
|
#include "usb-ids.h"
|
|
#include "gettext.h"
|
|
|
|
uint64_t libx52io_compare_reports(const libx52io_report *prev,
|
|
const libx52io_report *curr)
|
|
{
|
|
uint64_t status = 0;
|
|
|
|
if (prev == NULL || curr == NULL) {
|
|
// Treat either input being NULL as no change.
|
|
return 0;
|
|
}
|
|
|
|
#define CHECK_AXIS(axs) do { \
|
|
if (prev->axis[LIBX52IO_AXIS_ ## axs] != curr->axis[LIBX52IO_AXIS_ ## axs]) { \
|
|
status |= LIBX52IO_REPORT_AXIS_ ## axs; \
|
|
} \
|
|
} while(0)
|
|
|
|
CHECK_AXIS(X);
|
|
CHECK_AXIS(Y);
|
|
CHECK_AXIS(RZ);
|
|
CHECK_AXIS(Z);
|
|
CHECK_AXIS(RX);
|
|
CHECK_AXIS(RY);
|
|
CHECK_AXIS(SLIDER);
|
|
CHECK_AXIS(THUMBX);
|
|
CHECK_AXIS(THUMBY);
|
|
CHECK_AXIS(HATX);
|
|
CHECK_AXIS(HATY);
|
|
#undef CHECK_AXIS
|
|
|
|
#define CHECK_BUTTON(btn) do { \
|
|
if (prev->button[LIBX52IO_BTN_ ## btn] != curr->button[LIBX52IO_BTN_ ## btn]) { \
|
|
status |= LIBX52IO_REPORT_BTN_ ## btn; \
|
|
} \
|
|
} while(0)
|
|
|
|
CHECK_BUTTON(TRIGGER);
|
|
CHECK_BUTTON(TRIGGER_2);
|
|
CHECK_BUTTON(FIRE);
|
|
CHECK_BUTTON(PINKY);
|
|
CHECK_BUTTON(A);
|
|
CHECK_BUTTON(B);
|
|
CHECK_BUTTON(C);
|
|
CHECK_BUTTON(D);
|
|
CHECK_BUTTON(E);
|
|
CHECK_BUTTON(T1_UP);
|
|
CHECK_BUTTON(T1_DN);
|
|
CHECK_BUTTON(T2_UP);
|
|
CHECK_BUTTON(T2_DN);
|
|
CHECK_BUTTON(T3_UP);
|
|
CHECK_BUTTON(T3_DN);
|
|
CHECK_BUTTON(POV_1_N);
|
|
CHECK_BUTTON(POV_1_E);
|
|
CHECK_BUTTON(POV_1_S);
|
|
CHECK_BUTTON(POV_1_W);
|
|
CHECK_BUTTON(POV_2_N);
|
|
CHECK_BUTTON(POV_2_E);
|
|
CHECK_BUTTON(POV_2_S);
|
|
CHECK_BUTTON(POV_2_W);
|
|
CHECK_BUTTON(CLUTCH);
|
|
CHECK_BUTTON(MOUSE_PRIMARY);
|
|
CHECK_BUTTON(MOUSE_SECONDARY);
|
|
CHECK_BUTTON(MOUSE_SCROLL_UP);
|
|
CHECK_BUTTON(MOUSE_SCROLL_DN);
|
|
CHECK_BUTTON(FUNCTION);
|
|
CHECK_BUTTON(START_STOP);
|
|
CHECK_BUTTON(RESET);
|
|
CHECK_BUTTON(PG_UP);
|
|
CHECK_BUTTON(PG_DN);
|
|
CHECK_BUTTON(UP);
|
|
CHECK_BUTTON(DN);
|
|
CHECK_BUTTON(SELECT);
|
|
CHECK_BUTTON(MODE_1);
|
|
CHECK_BUTTON(MODE_2);
|
|
CHECK_BUTTON(MODE_3);
|
|
#undef CHECK_BUTTON
|
|
|
|
if (prev->mode != curr->mode) {
|
|
status |= LIBX52IO_REPORT_MODE;
|
|
}
|
|
|
|
if (prev->hat != curr->hat) {
|
|
status |= LIBX52IO_REPORT_HAT;
|
|
}
|
|
|
|
return status;
|
|
}
|