mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-04-26 17:11:28 +00:00
Remove some assumptions on packet format
This commit is contained in:
parent
22b8299230
commit
7f128c5286
@ -41,4 +41,16 @@ bool xap_respond_data_P(xap_token_t token, const void *data, size_t length);
|
|||||||
|
|
||||||
void xap_send(xap_token_t token, xap_response_flags_t response_flags, const void *data, size_t length);
|
void xap_send(xap_token_t token, xap_response_flags_t response_flags, const void *data, size_t length);
|
||||||
|
|
||||||
|
// TODO: gen from xap defs?
|
||||||
|
typedef struct {
|
||||||
|
xap_token_t token;
|
||||||
|
uint8_t length;
|
||||||
|
} xap_request_header_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
xap_token_t token;
|
||||||
|
xap_response_flags_t flags;
|
||||||
|
uint8_t length;
|
||||||
|
} xap_response_header_t;
|
||||||
|
|
||||||
#include <xap_generated.h>
|
#include <xap_generated.h>
|
||||||
|
@ -113,7 +113,7 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype
|
|||||||
static USBDescriptor desc;
|
static USBDescriptor desc;
|
||||||
uint16_t wValue = ((uint16_t)dtype << 8) | dindex;
|
uint16_t wValue = ((uint16_t)dtype << 8) | dindex;
|
||||||
desc.ud_string = NULL;
|
desc.ud_string = NULL;
|
||||||
desc.ud_size = get_usb_descriptor(wValue, wIndex, (const void **const) & desc.ud_string);
|
desc.ud_size = get_usb_descriptor(wValue, wIndex, (const void **const)&desc.ud_string);
|
||||||
if (desc.ud_string == NULL)
|
if (desc.ud_string == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
else
|
||||||
@ -1138,25 +1138,27 @@ void xap_send_base(uint8_t *data, uint8_t length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) {
|
void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) {
|
||||||
uint8_t rdata[XAP_EPSIZE] = {0};
|
uint8_t rdata[XAP_EPSIZE] = {0};
|
||||||
*(xap_token_t *)&rdata[0] = token;
|
xap_response_header_t *header = (xap_response_header_t *)&rdata[0];
|
||||||
if (length > (XAP_EPSIZE - 4)) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS);
|
header->token = token;
|
||||||
rdata[2] = response_flags;
|
|
||||||
|
if (length > (XAP_EPSIZE - sizeof(xap_response_header_t))) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS);
|
||||||
|
header->flags = response_flags;
|
||||||
|
|
||||||
if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) {
|
if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) {
|
||||||
rdata[3] = (uint8_t)length;
|
header->length = (uint8_t)length;
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
memcpy(&rdata[4], data, length);
|
memcpy(&rdata[sizeof(xap_response_header_t)], data, length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xap_send_base(rdata, sizeof(rdata));
|
xap_send_base(rdata, sizeof(rdata));
|
||||||
}
|
}
|
||||||
|
|
||||||
void xap_receive_base(const void *data) {
|
void xap_receive_base(const void *data) {
|
||||||
const uint8_t *u8data = (const uint8_t *)data;
|
const uint8_t *u8data = (const uint8_t *)data;
|
||||||
xap_token_t token = *(xap_token_t *)&u8data[0];
|
xap_request_header_t *header = (xap_request_header_t *)&u8data[0];
|
||||||
uint8_t length = u8data[2];
|
if (header->length <= (XAP_EPSIZE - sizeof(xap_request_header_t))) {
|
||||||
if (length <= (XAP_EPSIZE - 3)) {
|
xap_receive(header->token, &u8data[sizeof(xap_request_header_t)], header->length);
|
||||||
xap_receive(token, &u8data[3], length);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,25 +244,27 @@ void xap_send_base(uint8_t *data, uint8_t length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) {
|
void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) {
|
||||||
uint8_t rdata[XAP_EPSIZE] = {0};
|
uint8_t rdata[XAP_EPSIZE] = {0};
|
||||||
*(xap_token_t *)&rdata[0] = token;
|
xap_response_header_t *header = (xap_response_header_t *)&rdata[0];
|
||||||
if (length > (XAP_EPSIZE - 4)) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS);
|
header->token = token;
|
||||||
rdata[2] = response_flags;
|
|
||||||
|
if (length > (XAP_EPSIZE - sizeof(xap_response_header_t))) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS);
|
||||||
|
header->flags = response_flags;
|
||||||
|
|
||||||
if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) {
|
if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) {
|
||||||
rdata[3] = (uint8_t)length;
|
header->length = (uint8_t)length;
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
memcpy(&rdata[4], data, length);
|
memcpy(&rdata[sizeof(xap_response_header_t)], data, length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xap_send_base(rdata, sizeof(rdata));
|
xap_send_base(rdata, sizeof(rdata));
|
||||||
}
|
}
|
||||||
|
|
||||||
void xap_receive_base(const void *data) {
|
void xap_receive_base(const void *data) {
|
||||||
const uint8_t *u8data = (const uint8_t *)data;
|
const uint8_t *u8data = (const uint8_t *)data;
|
||||||
xap_token_t token = *(xap_token_t *)&u8data[0];
|
xap_request_header_t *header = (xap_request_header_t *)&u8data[0];
|
||||||
uint8_t length = u8data[2];
|
if (header->length <= (XAP_EPSIZE - sizeof(xap_request_header_t))) {
|
||||||
if (length <= (XAP_EPSIZE - 3)) {
|
xap_receive(header->token, &u8data[sizeof(xap_request_header_t)], header->length);
|
||||||
xap_receive(token, &u8data[3], length);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,25 +205,27 @@ void xap_send_base(uint8_t *data, uint8_t length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) {
|
void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) {
|
||||||
uint8_t rdata[XAP_BUFFER_SIZE] = {0};
|
uint8_t rdata[XAP_BUFFER_SIZE] = {0};
|
||||||
*(xap_token_t *)&rdata[0] = token;
|
xap_response_header_t *header = (xap_response_header_t *)&rdata[0];
|
||||||
if (length > (XAP_BUFFER_SIZE - 4)) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS);
|
header->token = token;
|
||||||
rdata[2] = response_flags;
|
|
||||||
|
if (length > (XAP_BUFFER_SIZE - sizeof(xap_response_header_t))) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS);
|
||||||
|
header->flags = response_flags;
|
||||||
|
|
||||||
if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) {
|
if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) {
|
||||||
rdata[3] = (uint8_t)length;
|
header->length = (uint8_t)length;
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
memcpy(&rdata[4], data, length);
|
memcpy(&rdata[sizeof(xap_response_header_t)], data, length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xap_send_base(rdata, sizeof(rdata));
|
xap_send_base(rdata, sizeof(rdata));
|
||||||
}
|
}
|
||||||
|
|
||||||
void xap_receive_base(const void *data) {
|
void xap_receive_base(const void *data) {
|
||||||
const uint8_t *u8data = (const uint8_t *)data;
|
const uint8_t *u8data = (const uint8_t *)data;
|
||||||
xap_token_t token = *(xap_token_t *)&u8data[0];
|
xap_request_header_t *header = (xap_request_header_t *)&u8data[0];
|
||||||
uint8_t length = u8data[2];
|
if (header->length <= (XAP_BUFFER_SIZE - sizeof(xap_request_header_t))) {
|
||||||
if (length <= (XAP_BUFFER_SIZE - 3)) {
|
xap_receive(header->token, &u8data[sizeof(xap_request_header_t)], header->length);
|
||||||
xap_receive(token, &u8data[3], length);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user