~ruther/qmk_firmware

19e2dd742b6c8e54c5751b39cf910e0f4fbb2a76 — Ryan 2 years ago 7c0116a
LUFA: Consolidate report sending code (#18629)

1 files changed, 43 insertions(+), 118 deletions(-)

M tmk_core/protocol/lufa/lufa.c
M tmk_core/protocol/lufa/lufa.c => tmk_core/protocol/lufa/lufa.c +43 -118
@@ 87,6 87,23 @@ static void    send_mouse(report_mouse_t *report);
static void    send_extra(report_extra_t *report);
host_driver_t  lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra};

void send_report(uint8_t endpoint, void *report, size_t size) {
    uint8_t timeout = 255;

    if (USB_DeviceState != DEVICE_STATE_Configured) return;

    Endpoint_SelectEndpoint(endpoint);

    /* Check if write ready for a polling interval around 10ms */
    while (timeout-- && !Endpoint_IsReadWriteAllowed()) {
        _delay_us(40);
    }
    if (!Endpoint_IsReadWriteAllowed()) return;

    Endpoint_Write_Stream_LE(report, size, NULL);
    Endpoint_ClearIN();
}

#ifdef VIRTSER_ENABLE
// clang-format off



@@ 121,30 138,8 @@ USB_ClassInfo_CDC_Device_t cdc_device = {
 * FIXME: Needs doc
 */
void raw_hid_send(uint8_t *data, uint8_t length) {
    // TODO: implement variable size packet
    if (length != RAW_EPSIZE) {
        return;
    }

    if (USB_DeviceState != DEVICE_STATE_Configured) {
        return;
    }

    // TODO: decide if we allow calls to raw_hid_send() in the middle
    // of other endpoint usage.
    uint8_t ep = Endpoint_GetCurrentEndpoint();

    Endpoint_SelectEndpoint(RAW_IN_EPNUM);

    // Check to see if the host is ready to accept another packet
    if (Endpoint_IsINReady()) {
        // Write data
        Endpoint_Write_Stream_LE(data, RAW_EPSIZE, NULL);
        // Finalize the stream transfer to send the last packet
        Endpoint_ClearIN();
    }

    Endpoint_SelectEndpoint(ep);
    if (length != RAW_EPSIZE) return;
    send_report(RAW_IN_EPNUM, data, RAW_EPSIZE);
}

/** \brief Raw HID Receive


@@ 250,29 245,6 @@ static void Console_Task(void) {
#endif

/*******************************************************************************
 * Joystick
 ******************************************************************************/
void send_joystick(report_joystick_t *report) {
#ifdef JOYSTICK_ENABLE
    uint8_t timeout = 255;

    /* Select the Joystick Report Endpoint */
    Endpoint_SelectEndpoint(JOYSTICK_IN_EPNUM);

    /* Check if write ready for a polling interval around 10ms */
    while (timeout-- && !Endpoint_IsReadWriteAllowed())
        _delay_us(40);
    if (!Endpoint_IsReadWriteAllowed()) return;

    /* Write Joystick Report Data */
    Endpoint_Write_Stream_LE(report, sizeof(report_joystick_t), NULL);

    /* Finalize the stream transfer to send the last packet */
    Endpoint_ClearIN();
#endif
}

/*******************************************************************************
 * USB Events
 ******************************************************************************/
/*


@@ 587,32 559,23 @@ static uint8_t keyboard_leds(void) {
 * FIXME: Needs doc
 */
static void send_keyboard(report_keyboard_t *report) {
    uint8_t timeout = 255;

    /* Select the Keyboard Report Endpoint */
    uint8_t ep   = KEYBOARD_IN_EPNUM;
    uint8_t size = KEYBOARD_REPORT_SIZE;
#ifdef NKRO_ENABLE
    if (keyboard_protocol && keymap_config.nkro) {
        ep   = SHARED_IN_EPNUM;
        size = sizeof(struct nkro_report);
    }
#endif
    Endpoint_SelectEndpoint(ep);
    /* Check if write ready for a polling interval around 10ms */
    while (timeout-- && !Endpoint_IsReadWriteAllowed())
        _delay_us(40);
    if (!Endpoint_IsReadWriteAllowed()) return;

    /* If we're in Boot Protocol, don't send any report ID or other funky fields */
    if (!keyboard_protocol) {
        Endpoint_Write_Stream_LE(&report->mods, 8, NULL);
        send_report(ep, &report->mods, 8);
    } else {
        Endpoint_Write_Stream_LE(report, size, NULL);
    }
#ifdef NKRO_ENABLE
        if (keymap_config.nkro) {
            ep   = SHARED_IN_EPNUM;
            size = sizeof(struct nkro_report);
        }
#endif

    /* Finalize the stream transfer to send the last packet */
    Endpoint_ClearIN();
        send_report(ep, report, size);
    }

    keyboard_report_sent = *report;
}


@@ 623,55 586,35 @@ static void send_keyboard(report_keyboard_t *report) {
 */
static void send_mouse(report_mouse_t *report) {
#ifdef MOUSE_ENABLE
    uint8_t timeout = 255;

    /* Select the Mouse Report Endpoint */
    Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);

    /* Check if write ready for a polling interval around 10ms */
    while (timeout-- && !Endpoint_IsReadWriteAllowed())
        _delay_us(40);
    if (!Endpoint_IsReadWriteAllowed()) return;

    /* Write Mouse Report Data */
    Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL);

    /* Finalize the stream transfer to send the last packet */
    Endpoint_ClearIN();
    send_report(MOUSE_IN_EPNUM, report, sizeof(report_mouse_t));
#endif
}

#if defined(EXTRAKEY_ENABLE) || defined(PROGRAMMABLE_BUTTON_ENABLE)
static void send_report(void *report, size_t size) {
    uint8_t timeout = 255;

    if (USB_DeviceState != DEVICE_STATE_Configured) return;

    Endpoint_SelectEndpoint(SHARED_IN_EPNUM);

    /* Check if write ready for a polling interval around 10ms */
    while (timeout-- && !Endpoint_IsReadWriteAllowed())
        _delay_us(40);
    if (!Endpoint_IsReadWriteAllowed()) return;

    Endpoint_Write_Stream_LE(report, size, NULL);
    Endpoint_ClearIN();
}
#endif

/** \brief Send Extra
 *
 * FIXME: Needs doc
 */
static void send_extra(report_extra_t *report) {
#ifdef EXTRAKEY_ENABLE
    send_report(report, sizeof(report_extra_t));
    send_report(SHARED_IN_EPNUM, report, sizeof(report_extra_t));
#endif
}

void send_joystick(report_joystick_t *report) {
#ifdef JOYSTICK_ENABLE
    send_report(JOYSTICK_IN_EPNUM, report, sizeof(report_joystick_t));
#endif
}

void send_programmable_button(report_programmable_button_t *report) {
#ifdef PROGRAMMABLE_BUTTON_ENABLE
    send_report(report, sizeof(report_programmable_button_t));
    send_report(SHARED_IN_EPNUM, report, sizeof(report_programmable_button_t));
#endif
}

void send_digitizer(report_digitizer_t *report) {
#ifdef DIGITIZER_ENABLE
    send_report(DIGITIZER_IN_EPNUM, report, sizeof(report_digitizer_t));
#endif
}



@@ 844,24 787,6 @@ void virtser_send(const uint8_t byte) {
}
#endif

void send_digitizer(report_digitizer_t *report) {
#ifdef DIGITIZER_ENABLE
    uint8_t timeout = 255;

    if (USB_DeviceState != DEVICE_STATE_Configured) return;

    Endpoint_SelectEndpoint(DIGITIZER_IN_EPNUM);

    /* Check if write ready for a polling interval around 10ms */
    while (timeout-- && !Endpoint_IsReadWriteAllowed())
        _delay_us(40);
    if (!Endpoint_IsReadWriteAllowed()) return;

    Endpoint_Write_Stream_LE(report, sizeof(report_digitizer_t), NULL);
    Endpoint_ClearIN();
#endif
}

/*******************************************************************************
 * main
 ******************************************************************************/