From 13ff2306150db7881eae5822173ccd3b7b262792 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 28 Dec 2017 12:48:10 -0500 Subject: [PATCH 1/4] slow-acting --- keyboards/planck/rules.mk | 2 +- quantum/quantum.c | 32 ++++++++++++++++ quantum/quantum.h | 6 +++ tmk_core/protocol/lufa/lufa.c | 70 ++++++++++++++++++++--------------- 4 files changed, 80 insertions(+), 30 deletions(-) diff --git a/keyboards/planck/rules.mk b/keyboards/planck/rules.mk index 439f7db645..4d882d0b0b 100644 --- a/keyboards/planck/rules.mk +++ b/keyboards/planck/rules.mk @@ -65,7 +65,7 @@ CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = yes # MIDI controls +MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/quantum/quantum.c b/quantum/quantum.c index c80975f21b..49b1e3ee78 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -1296,3 +1296,35 @@ __attribute__ ((weak)) void shutdown_user() {} //------------------------------------------------------------------------------ + +#ifdef CONSOLE_ENABLE + +__attribute__ ((weak)) +void process_console_data_user(uint8_t * data, uint8_t length) { +} + +__attribute__ ((weak)) +void process_console_data_kb(uint8_t * data, uint8_t length) { + process_console_data_user(data, length); +} + +void process_console_data_quantum(uint8_t * data, uint8_t length) { + // print("Received message:\n "); + // while (*data) { + // sendchar(*data); + // data++; + // } + switch (data[0]) { + case 0xFE: + print("Entering bootloader\n"); + reset_keyboard(); + break; + case 0x01: + print("Saying hello\n"); + audio_on(); + break; + } + process_console_data_kb(data, length); +} + +#endif \ No newline at end of file diff --git a/quantum/quantum.h b/quantum/quantum.h index 056d372926..0e9e0176d7 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -193,4 +193,10 @@ void led_set_kb(uint8_t usb_led); void api_send_unicode(uint32_t unicode); +#ifdef CONSOLE_ENABLE +void process_console_data_user(uint8_t * data, uint8_t length); +void process_console_data_kb(uint8_t * data, uint8_t length); +void process_console_data_quantum(uint8_t * data, uint8_t length); +#endif + #endif diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index e3f8724e81..c6d4d8789a 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -264,15 +264,27 @@ static void raw_hid_task(void) * Console ******************************************************************************/ #ifdef CONSOLE_ENABLE + +static bool console_flush = false; +#define CONSOLE_FLUSH_SET(b) do { \ + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {\ + console_flush = b; \ + } \ +} while (0) + static void Console_Task(void) { + /* Device must be connected and configured for the task to run */ if (USB_DeviceState != DEVICE_STATE_Configured) return; + + /* Create a temporary buffer to hold the read in report from the host */ + uint8_t ConsoleData[CONSOLE_EPSIZE]; + bool data_read = false; uint8_t ep = Endpoint_GetCurrentEndpoint(); -#if 0 // TODO: impl receivechar()/recvchar() Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM); @@ -282,39 +294,45 @@ static void Console_Task(void) /* Check to see if the packet contains data */ if (Endpoint_IsReadWriteAllowed()) { - /* Create a temporary buffer to hold the read in report from the host */ - uint8_t ConsoleData[CONSOLE_EPSIZE]; /* Read Console Report Data */ Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); - - /* Process Console Report Data */ - //ProcessConsoleHIDReport(ConsoleData); + data_read = true; } /* Finalize the stream transfer to send the last packet */ Endpoint_ClearOUT(); - } -#endif - /* IN packet */ - Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); - if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) { - Endpoint_SelectEndpoint(ep); - return; + if (data_read) { + /* Process Console Report Data */ + process_console_data_quantum(ConsoleData, sizeof(ConsoleData)); + } + } - // fill empty bank - while (Endpoint_IsReadWriteAllowed()) - Endpoint_Write_8(0); + if (console_flush) { + /* IN packet */ + Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); + if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) { + Endpoint_SelectEndpoint(ep); + return; + } - // flash senchar packet - if (Endpoint_IsINReady()) { - Endpoint_ClearIN(); + // fill empty bank + while (Endpoint_IsReadWriteAllowed()) + Endpoint_Write_8(0); + + // flash senchar packet + if (Endpoint_IsINReady()) { + Endpoint_ClearIN(); + } + // CONSOLE_FLUSH_SET(false); } Endpoint_SelectEndpoint(ep); + } + #endif @@ -381,12 +399,6 @@ void EVENT_USB_Device_WakeUp() #ifdef CONSOLE_ENABLE -static bool console_flush = false; -#define CONSOLE_FLUSH_SET(b) do { \ - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {\ - console_flush = b; \ - } \ -} while (0) // called every 1ms void EVENT_USB_Device_StartOfFrame(void) @@ -395,9 +407,9 @@ void EVENT_USB_Device_StartOfFrame(void) if (++count % 50) return; count = 0; - if (!console_flush) return; + //if (!console_flush) return; Console_Task(); - console_flush = false; + //console_flush = false; } #endif @@ -440,10 +452,10 @@ void EVENT_USB_Device_ConfigurationChanged(void) /* Setup Console HID Report Endpoints */ ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); -#if 0 +// #if 0 ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); -#endif +// #endif #endif #ifdef NKRO_ENABLE From f8d340a9ddaf8d4c90c2f25060d492d7500f3fed Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 28 Dec 2017 16:57:12 -0500 Subject: [PATCH 2/4] enable corret endpoint --- tmk_core/protocol/lufa/descriptor.h | 4 ++-- tmk_core/protocol/lufa/lufa.c | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h index 61c42c9dfc..ccec89ca18 100644 --- a/tmk_core/protocol/lufa/descriptor.h +++ b/tmk_core/protocol/lufa/descriptor.h @@ -208,8 +208,8 @@ typedef struct #ifdef CONSOLE_ENABLE # define CONSOLE_IN_EPNUM (RAW_OUT_EPNUM + 1) -//# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) -# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) +# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) +//# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) #else # define CONSOLE_OUT_EPNUM RAW_OUT_EPNUM #endif diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index c6d4d8789a..530cc01288 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -327,6 +327,7 @@ static void Console_Task(void) Endpoint_ClearIN(); } // CONSOLE_FLUSH_SET(false); + console_flush = false; } Endpoint_SelectEndpoint(ep); @@ -398,7 +399,8 @@ void EVENT_USB_Device_WakeUp() -#ifdef CONSOLE_ENABLE +// #ifdef CONSOLE_ENABLE +#if 0 // called every 1ms void EVENT_USB_Device_StartOfFrame(void) @@ -1113,7 +1115,7 @@ static void setup_usb(void) USB_Init(); // for Console_Task - USB_Device_EnableSOFEvents(); + //USB_Device_EnableSOFEvents(); print_set_sendchar(sendchar); } @@ -1228,6 +1230,10 @@ int main(void) raw_hid_task(); #endif +#ifdef CONSOLE_ENABLE + Console_Task(); +#endif + #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); #endif From 426ace718bad28397c605062391a3d1de9635463 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 28 Dec 2017 17:37:45 -0500 Subject: [PATCH 3/4] an conditional for console in --- keyboards/planck/config.h | 2 ++ quantum/quantum.c | 19 ++++++---- quantum/quantum.h | 2 +- tmk_core/protocol/lufa/descriptor.h | 7 ++-- tmk_core/protocol/lufa/lufa.c | 54 +++++++++++++++-------------- 5 files changed, 49 insertions(+), 35 deletions(-) diff --git a/keyboards/planck/config.h b/keyboards/planck/config.h index 452a99d746..45ef0afb6b 100644 --- a/keyboards/planck/config.h +++ b/keyboards/planck/config.h @@ -44,6 +44,8 @@ along with this program. If not, see . #define AUDIO_VOICES #define C6_AUDIO +#define CONSOLE_IN_ENABLE + #define BACKLIGHT_PIN B7 /* COL2ROW or ROW2COL */ diff --git a/quantum/quantum.c b/quantum/quantum.c index 49b1e3ee78..8c4c5ed725 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -1297,7 +1297,7 @@ void shutdown_user() {} //------------------------------------------------------------------------------ -#ifdef CONSOLE_ENABLE +#ifdef CONSOLE_IN_ENABLE __attribute__ ((weak)) void process_console_data_user(uint8_t * data, uint8_t length) { @@ -1309,19 +1309,26 @@ void process_console_data_kb(uint8_t * data, uint8_t length) { } void process_console_data_quantum(uint8_t * data, uint8_t length) { + // This can be used for testing - it echos back the information received // print("Received message:\n "); // while (*data) { // sendchar(*data); // data++; // } switch (data[0]) { - case 0xFE: - print("Entering bootloader\n"); - reset_keyboard(); - break; case 0x01: print("Saying hello\n"); - audio_on(); + #ifdef AUDIO_ENABLE + audio_on(); + #endif + break; + case 0xFE: + #ifdef CONSOLE_IN_BOOTLOADER + print("Entering bootloader\n"); + reset_keyboard(); + #else + print("Unable to enter bootloader\n"); + #endif break; } process_console_data_kb(data, length); diff --git a/quantum/quantum.h b/quantum/quantum.h index 0e9e0176d7..a2d64bbcd2 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -193,7 +193,7 @@ void led_set_kb(uint8_t usb_led); void api_send_unicode(uint32_t unicode); -#ifdef CONSOLE_ENABLE +#ifdef CONSOLE_IN_ENABLE void process_console_data_user(uint8_t * data, uint8_t length); void process_console_data_kb(uint8_t * data, uint8_t length); void process_console_data_quantum(uint8_t * data, uint8_t length); diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h index ccec89ca18..ee5ecf4710 100644 --- a/tmk_core/protocol/lufa/descriptor.h +++ b/tmk_core/protocol/lufa/descriptor.h @@ -208,8 +208,11 @@ typedef struct #ifdef CONSOLE_ENABLE # define CONSOLE_IN_EPNUM (RAW_OUT_EPNUM + 1) -# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) -//# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) +# ifdef CONSOLE_IN_ENABLE +# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) +# else +# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) +# endif #else # define CONSOLE_OUT_EPNUM RAW_OUT_EPNUM #endif diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 530cc01288..eec4d4f4ae 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -274,41 +274,43 @@ static bool console_flush = false; static void Console_Task(void) { - /* Device must be connected and configured for the task to run */ if (USB_DeviceState != DEVICE_STATE_Configured) return; - - /* Create a temporary buffer to hold the read in report from the host */ - uint8_t ConsoleData[CONSOLE_EPSIZE]; - bool data_read = false; uint8_t ep = Endpoint_GetCurrentEndpoint(); - // TODO: impl receivechar()/recvchar() - Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM); + #ifdef CONSOLE_IN_ENABLE + /* Create a temporary buffer to hold the read in report from the host */ + uint8_t ConsoleData[CONSOLE_EPSIZE]; + bool data_read = false; - /* Check to see if a packet has been sent from the host */ - if (Endpoint_IsOUTReceived()) - { - /* Check to see if the packet contains data */ - if (Endpoint_IsReadWriteAllowed()) - { + // TODO: impl receivechar()/recvchar() + Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM); - /* Read Console Report Data */ - Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); - data_read = true; - } + /* Check to see if a packet has been sent from the host */ + if (Endpoint_IsOUTReceived()) + { + /* Check to see if the packet contains data */ + if (Endpoint_IsReadWriteAllowed()) + { - /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearOUT(); + /* Read Console Report Data */ + Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); + data_read = true; + } - if (data_read) { - /* Process Console Report Data */ - process_console_data_quantum(ConsoleData, sizeof(ConsoleData)); - } + /* Finalize the stream transfer to send the last packet */ + Endpoint_ClearOUT(); - } + if (data_read) { + /* Process Console Report Data */ + process_console_data_quantum(ConsoleData, sizeof(ConsoleData)); + } + + } + + #endif if (console_flush) { /* IN packet */ @@ -454,10 +456,10 @@ void EVENT_USB_Device_ConfigurationChanged(void) /* Setup Console HID Report Endpoints */ ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); -// #if 0 + #ifdef CONSOLE_IN_ENABLE ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); -// #endif + #endif #endif #ifdef NKRO_ENABLE From df0d2af9612522428233b164b15f5c17214055a5 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 28 Dec 2017 18:33:55 -0500 Subject: [PATCH 4/4] adds documentation for console in --- docs/feature_console_in.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 docs/feature_console_in.md diff --git a/docs/feature_console_in.md b/docs/feature_console_in.md new file mode 100644 index 0000000000..8e2cd5a923 --- /dev/null +++ b/docs/feature_console_in.md @@ -0,0 +1,26 @@ +# Console In + +The "Console" in QMK refers to PJRC's vendor page of `0xFF31` and usage page of `0x74` - this is mainly used for sending debug statements to the computer that can be read via the QMK Toolbox (recommended), or HID listen. + +When `#define CONSOLE_IN_ENABLE` is placed in the `config.h` file, the keyboard will also listen to messages sent to the keyboard, will be able to respond in a custom way, defined at the `quantum`, `kb`, or `user` level. A keymap's example might look like this: + +```c +void process_console_data_user(uint8_t * data, uint8_t length) { + switch (data[0]) { + case 0x05: + print("Sending back a message to the computer\n"); + break; + } +} +``` + +Which will execute when a report is sent to the keyboard when the first byte is `0x05`. + +## Default actions (defined at the `quantum` level) + +When the first byte is: + +* `0x01`: Print "Saying hello\n" via the console, and play the audio on song +* `0xFE`: Enter the bootloader - only works when `CONSOLE_IN_BOOTLOADER` is defined in the `config.h` + +This needs to be fleshed out a bit more with some sort of versioning. \ No newline at end of file