105 lines
4.9 KiB
C
105 lines
4.9 KiB
C
#include "main.h"
|
|
|
|
const field_map_t api_field_map[] = {
|
|
/* Index, Rdonly, Type, Len, Offset in struct */
|
|
{ 0, true, UINT8, 1, offsetof(device_t, active_output) },
|
|
{ 1, true, INT16, 2, offsetof(device_t, pointer_x) },
|
|
{ 2, true, INT16, 2, offsetof(device_t, pointer_y) },
|
|
{ 3, true, INT16, 2, offsetof(device_t, mouse_buttons) },
|
|
|
|
/* Output A */
|
|
{ 10, false, UINT32, 4, offsetof(device_t, config.output[0].number) },
|
|
{ 11, false, UINT32, 4, offsetof(device_t, config.output[0].screen_count) },
|
|
{ 12, false, INT32, 4, offsetof(device_t, config.output[0].speed_x) },
|
|
{ 13, false, INT32, 4, offsetof(device_t, config.output[0].speed_y) },
|
|
{ 14, false, INT32, 4, offsetof(device_t, config.output[0].border.top) },
|
|
{ 15, false, INT32, 4, offsetof(device_t, config.output[0].border.bottom) },
|
|
// { 16, false, UINT8, 1, offsetof(device_t, config.output[0].os) },
|
|
{ 17, false, UINT8, 1, offsetof(device_t, config.output[0].pos) },
|
|
{ 18, false, UINT8, 1, offsetof(device_t, config.output[0].mouse_park_pos) },
|
|
// { 19, false, UINT8, 1, offsetof(device_t, config.output[0].screensaver.mode) },
|
|
// { 20, false, UINT8, 1, offsetof(device_t, config.output[0].screensaver.only_if_inactive) },
|
|
|
|
/* Until we increase the payload size from 8 bytes, clamp to avoid exceeding the field size */
|
|
// { 21, false, UINT64, 7, offsetof(device_t, config.output[0].screensaver.idle_time_us) },
|
|
// { 22, false, UINT64, 7, offsetof(device_t, config.output[0].screensaver.max_time_us) },
|
|
|
|
/* Output B */
|
|
{ 40, false, UINT32, 4, offsetof(device_t, config.output[1].number) },
|
|
{ 41, false, UINT32, 4, offsetof(device_t, config.output[1].screen_count) },
|
|
{ 42, false, INT32, 4, offsetof(device_t, config.output[1].speed_x) },
|
|
{ 43, false, INT32, 4, offsetof(device_t, config.output[1].speed_y) },
|
|
{ 44, false, INT32, 4, offsetof(device_t, config.output[1].border.top) },
|
|
{ 45, false, INT32, 4, offsetof(device_t, config.output[1].border.bottom) },
|
|
// { 46, false, UINT8, 1, offsetof(device_t, config.output[1].os) },
|
|
{ 47, false, UINT8, 1, offsetof(device_t, config.output[1].pos) },
|
|
{ 48, false, UINT8, 1, offsetof(device_t, config.output[1].mouse_park_pos) },
|
|
// { 49, false, UINT8, 1, offsetof(device_t, config.output[1].screensaver.mode) },
|
|
// { 50, false, UINT8, 1, offsetof(device_t, config.output[1].screensaver.only_if_inactive) },
|
|
// { 51, false, UINT64, 7, offsetof(device_t, config.output[1].screensaver.idle_time_us) },
|
|
// { 52, false, UINT64, 7, offsetof(device_t, config.output[1].screensaver.max_time_us) },
|
|
|
|
/* Common config */
|
|
{ 70, false, UINT32, 4, offsetof(device_t, config.version) },
|
|
{ 71, false, UINT8, 1, offsetof(device_t, config.force_mouse_boot_mode) },
|
|
{ 72, false, UINT8, 1, offsetof(device_t, config.force_kbd_boot_protocol) },
|
|
{ 73, false, UINT8, 1, offsetof(device_t, config.kbd_led_as_indicator) },
|
|
{ 74, false, UINT8, 1, offsetof(device_t, config.hotkey_toggle) },
|
|
{ 75, false, UINT8, 1, offsetof(device_t, config.enable_acceleration) },
|
|
{ 76, false, UINT8, 1, offsetof(device_t, config.enforce_ports) },
|
|
{ 77, false, UINT16, 2, offsetof(device_t, config.jump_treshold) },
|
|
|
|
/* Firmware */
|
|
{ 78, true, UINT16, 2, offsetof(device_t, _running_fw.version) },
|
|
{ 79, true, UINT32, 4, offsetof(device_t, _running_fw.checksum) },
|
|
|
|
{ 80, true, UINT8, 1, offsetof(device_t, keyboard_connected) },
|
|
{ 81, true, UINT8, 1, offsetof(device_t, switch_lock) },
|
|
{ 82, true, UINT8, 1, offsetof(device_t, relative_mouse) },
|
|
};
|
|
|
|
const field_map_t* get_field_map_entry(uint32_t index) {
|
|
for (unsigned int i = 0; i < ARRAY_SIZE(api_field_map); i++) {
|
|
if (api_field_map[i].idx == index) {
|
|
return &api_field_map[i];
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
const field_map_t* get_field_map_index(uint32_t index) {
|
|
return &api_field_map[index];
|
|
}
|
|
|
|
size_t get_field_map_length(void) {
|
|
return ARRAY_SIZE(api_field_map);
|
|
}
|
|
|
|
void _queue_packet(uint8_t *payload, device_t *state, uint8_t type, uint8_t len, uint8_t id, uint8_t inst) {
|
|
hid_generic_pkt_t generic_packet = {
|
|
.instance = inst,
|
|
.report_id = id,
|
|
.type = type,
|
|
.len = len,
|
|
};
|
|
|
|
memcpy(generic_packet.data, payload, len);
|
|
queue_try_add(&state->hid_queue_out, &generic_packet);
|
|
}
|
|
|
|
void queue_cfg_packet(uart_packet_t *packet, device_t *state) {
|
|
uint8_t raw_packet[RAW_PACKET_LENGTH];
|
|
write_raw_packet(raw_packet, packet);
|
|
_queue_packet(raw_packet, state, 0, RAW_PACKET_LENGTH, REPORT_ID_VENDOR, ITF_NUM_HID_VENDOR);
|
|
}
|
|
|
|
void queue_cc_packet(uint8_t *payload, device_t *state) {
|
|
_queue_packet(payload, state, 1, CONSUMER_CONTROL_LENGTH, REPORT_ID_CONSUMER, ITF_NUM_HID);
|
|
}
|
|
|
|
void queue_system_packet(uint8_t *payload, device_t *state) {
|
|
_queue_packet(payload, state, 2, SYSTEM_CONTROL_LENGTH, REPORT_ID_SYSTEM, ITF_NUM_HID);
|
|
}
|