#include QMK_KEYBOARD_H #include #include "webusb.h" #include "wait.h" webusb_state_t webusb_state = { .paired = false, .pairing = false, }; void webusb_receive(uint8_t *data, uint8_t length) { uint8_t command = data[0]; if(command == WEBUSB_CMD_PAIR && webusb_state.pairing == true) { uint8_t event[3]; webusb_state.pairing = false; webusb_state.paired = true; event[0] = WEBUSB_STATUS_OK; event[1] = WEBUSB_EVT_PAIRED; event[2] = WEBUSB_STOP_BIT; webusb_send(event, sizeof(event)); return; } if(command == WEBUSB_GET_FW_VERSION) { // Landing page + packet headers(2) + stop bit(1) uint8_t lp_size = sizeof(FIRMWARE_VERSION) + 3; uint8_t url[lp_size]; uint8_t event[2]; event[0] = WEBUSB_STATUS_OK; event[1] = WEBUSB_EVT_FW_VERSION; uint8_t stop[1]; stop[0] = WEBUSB_STOP_BIT; memcpy(url, event, 2); memcpy(url + 2, FIRMWARE_VERSION, sizeof(FIRMWARE_VERSION)); memcpy(url + 2 + sizeof(FIRMWARE_VERSION), stop, 1); webusb_send(url, lp_size); return; } if(webusb_state.paired == true) { switch(command) { //Handle commands in here case WEBUSB_GET_LAYER: webusb_layer_event(); break; default: break; } } else { webusb_error(WEBUSB_STATUS_NOT_PAIRED); } }; void webusb_layer_event() { uint8_t layer; uint8_t event[4]; layer = biton32(layer_state); event[0] = WEBUSB_STATUS_OK; event[1] = WEBUSB_EVT_LAYER; event[2] = layer; event[3] = WEBUSB_STOP_BIT; webusb_send(event, sizeof(event)); } void webusb_error(uint8_t code) { uint8_t buffer[1]; buffer[0] = code; webusb_send(buffer, 1); }