/* Copyright 2021 Jay Greco * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* Remote keyboard is an experimental feature that allows for connecting another keyboard, macropad, numpad, or accessory without requiring an additional USB connection. The "remote keyboard" forwards its keystrokes using UART serial over TRRS. Dynamic VUSB detect allows the keyboard automatically switch to host or remote mode depending on which is connected to the USB port. Possible functionality includes the ability to send data from the host to the remote using a reverse link, allowing for LED sync, configuration, and more data sharing between devices. This will require a new communication protocol, as the current one is limited. */ #include "remote_kb.h" #include "quantum.h" #include "uart.h" #include "wait.h" #include "debug.h" uint8_t msg[UART_MSG_LEN], msg_idx = 0; bool is_host = true; // Private functions static bool vbus_detect(void) { #if defined(__AVR_ATmega32U4__) //returns true if VBUS is present, false otherwise. USBCON |= (1 << OTGPADE); //enables VBUS pad _delay_us(10); return (USBSTA & (1<> 8) & 0xFF; msg[IDX_PRESSED] = pressed; msg[IDX_CHECKSUM] = chksum8(msg, UART_MSG_LEN-1); uart_transmit(msg, UART_MSG_LEN); } static inline void print_message_buffer(void) { for (int i=0; ievent.pressed); } } // Public functions void matrix_init_remote_kb(void) { uart_init(SERIAL_UART_BAUD); is_host = vbus_detect(); } void process_record_remote_kb(uint16_t keycode, keyrecord_t *record) { #if defined (KEYBOARD_HOST) handle_host_outgoing(); #elif defined(KEYBOARD_REMOTE) handle_remote_outgoing(keycode, record); #else //auto check with VBUS if (is_host) { handle_host_outgoing(); } else { handle_remote_outgoing(keycode, record); } #endif } void matrix_scan_remote_kb(void) { #if defined(KEYBOARD_HOST) handle_host_incoming(); #elif defined (KEYBOARD_REMOTE) handle_remote_incoming(); #else //auto check with VBUS if (is_host) { handle_host_incoming(); } else { handle_remote_incoming(); } #endif }