summaryrefslogtreecommitdiff
path: root/examples/host
diff options
context:
space:
mode:
authorhathach <[email protected]>2021-05-17 13:54:39 +0700
committerhathach <[email protected]>2021-05-18 12:58:24 +0700
commitffdcf9a0d00ad8eba544c4404e27275685ef9cab (patch)
tree784cb69f048a71099e2c4dfa6a906dca26dfaaa9 /examples/host
parentda6a7fb2bbb5ee07914e684a5162a9534c10bbb1 (diff)
move report_info to application
update API accordingly, update hid parser for usage, and usage_page.
Diffstat (limited to 'examples/host')
-rw-r--r--examples/host/cdc_msc_hid/src/hid_app.c209
-rw-r--r--examples/host/cdc_msc_hid/src/main.c124
2 files changed, 213 insertions, 120 deletions
diff --git a/examples/host/cdc_msc_hid/src/hid_app.c b/examples/host/cdc_msc_hid/src/hid_app.c
new file mode 100644
index 000000000..4f8556274
--- /dev/null
+++ b/examples/host/cdc_msc_hid/src/hid_app.c
@@ -0,0 +1,209 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021, Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+
+#include "bsp/board.h"
+#include "tusb.h"
+
+//--------------------------------------------------------------------+
+// MACRO TYPEDEF CONSTANT ENUM DECLARATION
+//--------------------------------------------------------------------+
+#define MAX_REPORT 4
+
+static uint8_t const keycode2ascii[128][2] = { HID_KEYCODE_TO_ASCII };
+
+static uint8_t _report_count[CFG_TUH_HID];
+static tuh_hid_report_info_t _report_info[CFG_TUH_HID][MAX_REPORT];
+
+static void process_kbd_report(hid_keyboard_report_t const *report);
+static void process_mouse_report(hid_mouse_report_t const * report);
+
+void hid_app_task(void)
+{
+}
+
+//--------------------------------------------------------------------+
+// TinyUSB Callbacks
+//--------------------------------------------------------------------+
+
+void tuh_hid_mounted_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len)
+{
+ printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance);
+
+ // Parse report descriptor with built-in parser
+ _report_count[instance] = tuh_hid_parse_report_descriptor(_report_info[instance], MAX_REPORT, desc_report, desc_len);
+
+ if (_report_count[instance])
+ {
+ printf("Composite with %u reports", _report_count[instance]);
+ }else
+ {
+ printf("Single report");
+ }
+
+ // Interface protocol
+ const char* protocol_str[] = { "None", "Keyboard", "Mouse" }; // hid_protocol_type_t
+ uint8_t const interface_protocol = tuh_n_hid_n_interface_protocol(dev_addr, instance);
+ printf(", Interface protocol = %s, ", protocol_str[interface_protocol]);
+}
+
+void tuh_hid_unmounted_cb(uint8_t dev_addr, uint8_t instance)
+{
+ printf("HID device address = %d, instance = %d is unmounted\r\n", dev_addr, instance);
+}
+
+void tuh_hid_get_report_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len)
+{
+ uint8_t const rpt_count = _report_count[instance];
+ tuh_hid_report_info_t* rpt_info;
+
+ if (rpt_count)
+ {
+ // Composite report, 1st byte is report ID, data starts from 2nd byte
+ // Note: report index = report ID - 1
+ uint8_t idx = report[0] - 1;
+ rpt_info = &_report_info[instance][idx];
+
+ report++;
+ }else
+ {
+ rpt_info = &_report_info[instance][0];
+ }
+
+ if ( rpt_info->usage_page == HID_USAGE_PAGE_DESKTOP )
+ {
+ switch (rpt_info->usage)
+ {
+ case HID_USAGE_DESKTOP_KEYBOARD:
+ TU_LOG1("HID receive keyboard report\r\n");
+ // Assume keyboard follow boot report layout
+ process_kbd_report( (hid_keyboard_report_t const*) report );
+ break;
+
+ case HID_USAGE_DESKTOP_MOUSE:
+ TU_LOG1("HID receive mouse report\r\n");
+ // Assume mouse follow boot report layout
+ process_mouse_report( (hid_mouse_report_t const*) report );
+ break;
+
+ default: break;
+ }
+ }
+}
+
+//--------------------------------------------------------------------+
+// Keyboard
+//--------------------------------------------------------------------+
+
+// look up new key in previous keys
+static inline bool find_key_in_report(hid_keyboard_report_t const *report, uint8_t keycode)
+{
+ for(uint8_t i=0; i<6; i++)
+ {
+ if (report->keycode[i] == keycode) return true;
+ }
+
+ return false;
+}
+
+static void process_kbd_report(hid_keyboard_report_t const *report)
+{
+ static hid_keyboard_report_t prev_report = { 0, 0, {0} }; // previous report to check key released
+
+ //------------- example code ignore control (non-printable) key affects -------------//
+ for(uint8_t i=0; i<6; i++)
+ {
+ if ( report->keycode[i] )
+ {
+ if ( find_key_in_report(&prev_report, report->keycode[i]) )
+ {
+ // exist in previous report means the current key is holding
+ }else
+ {
+ // not existed in previous report means the current key is pressed
+ bool const is_shift = report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);
+ uint8_t ch = keycode2ascii[report->keycode[i]][is_shift ? 1 : 0];
+ putchar(ch);
+ if ( ch == '\r' ) putchar('\n'); // added new line for enter key
+
+ fflush(stdout); // flush right away, else nanolib will wait for newline
+ }
+ }
+ // TODO example skips key released
+ }
+
+ prev_report = *report;
+}
+
+//--------------------------------------------------------------------+
+// Mouse
+//--------------------------------------------------------------------+
+
+void cursor_movement(int8_t x, int8_t y, int8_t wheel)
+{
+ // Move X using ansi escape
+ if ( x < 0)
+ {
+ printf(ANSI_CURSOR_BACKWARD(%d), (-x)); // move left
+ }else if ( x > 0)
+ {
+ printf(ANSI_CURSOR_FORWARD(%d), x); // move right
+ }
+
+ // Move Y using ansi escape
+ if ( y < 0)
+ {
+ printf(ANSI_CURSOR_UP(%d), (-y)); // move up
+ }else if ( y > 0)
+ {
+ printf(ANSI_CURSOR_DOWN(%d), y); // move down
+ }
+
+ // Scroll using ansi escape
+ if (wheel < 0)
+ {
+ printf(ANSI_SCROLL_UP(%d), (-wheel)); // scroll up
+ }else if (wheel > 0)
+ {
+ printf(ANSI_SCROLL_DOWN(%d), wheel); // scroll down
+ }
+}
+
+static void process_mouse_report(hid_mouse_report_t const * report)
+{
+ static hid_mouse_report_t prev_report = { 0 };
+
+ //------------- button state -------------//
+ uint8_t button_changed_mask = report->buttons ^ prev_report.buttons;
+ if ( button_changed_mask & report->buttons)
+ {
+ printf(" %c%c%c ",
+ report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-',
+ report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-',
+ report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-');
+ }
+
+ //------------- cursor movement -------------//
+ cursor_movement(report->x, report->y, report->wheel);
+}
diff --git a/examples/host/cdc_msc_hid/src/main.c b/examples/host/cdc_msc_hid/src/main.c
index 40642561b..7ae814e38 100644
--- a/examples/host/cdc_msc_hid/src/main.c
+++ b/examples/host/cdc_msc_hid/src/main.c
@@ -37,7 +37,7 @@ void print_greeting(void);
void led_blinking_task(void);
extern void cdc_task(void);
-extern void hid_task(void);
+extern void hid_app_task(void);
/*------------- MAIN -------------*/
int main(void)
@@ -58,7 +58,7 @@ int main(void)
#endif
#if CFG_TUH_HID
- hid_task();
+ hid_app_task();
#endif
}
@@ -106,127 +106,11 @@ void cdc_task(void)
#endif
//--------------------------------------------------------------------+
-// USB HID
-//--------------------------------------------------------------------+
-uint8_t const keycode2ascii[128][2] = { HID_KEYCODE_TO_ASCII };
-
-// look up new key in previous keys
-static inline bool find_key_in_report(hid_keyboard_report_t const *p_report, uint8_t keycode)
-{
- for(uint8_t i=0; i<6; i++)
- {
- if (p_report->keycode[i] == keycode) return true;
- }
-
- return false;
-}
-
-static inline void process_kbd_report(hid_keyboard_report_t const *p_new_report)
-{
- static hid_keyboard_report_t prev_report = { 0, 0, {0} }; // previous report to check key released
-
- //------------- example code ignore control (non-printable) key affects -------------//
- for(uint8_t i=0; i<6; i++)
- {
- if ( p_new_report->keycode[i] )
- {
- if ( find_key_in_report(&prev_report, p_new_report->keycode[i]) )
- {
- // exist in previous report means the current key is holding
- }else
- {
- // not existed in previous report means the current key is pressed
- bool const is_shift = p_new_report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);
- uint8_t ch = keycode2ascii[p_new_report->keycode[i]][is_shift ? 1 : 0];
- putchar(ch);
- if ( ch == '\r' ) putchar('\n'); // added new line for enter key
-
- fflush(stdout); // flush right away, else nanolib will wait for newline
- }
- }
- // TODO example skips key released
- }
-
- prev_report = *p_new_report;
-}
-
-void tuh_hid_mounted_cb(uint8_t dev_addr, uint8_t instance)
-{
- printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance);
-// printf("A Keyboard device (address %d) is mounted\r\n", dev_addr);
-// printf("A Mouse device (address %d) is mounted\r\n", dev_addr);
-}
-
-void tuh_hid_unmounted_cb(uint8_t dev_addr, uint8_t instance)
-{
- printf("HID device address = %d, instance = %d is unmounted\r\n", dev_addr, instance);
-// printf("A Keyboard device (address %d) is unmounted\r\n", dev_addr);
-// printf("A Mouse device (address %d) is unmounted\r\n", dev_addr);
-}
-
-void cursor_movement(int8_t x, int8_t y, int8_t wheel)
-{
- //------------- X -------------//
- if ( x < 0)
- {
- printf(ANSI_CURSOR_BACKWARD(%d), (-x)); // move left
- }else if ( x > 0)
- {
- printf(ANSI_CURSOR_FORWARD(%d), x); // move right
- }else { }
-
- //------------- Y -------------//
- if ( y < 0)
- {
- printf(ANSI_CURSOR_UP(%d), (-y)); // move up
- }else if ( y > 0)
- {
- printf(ANSI_CURSOR_DOWN(%d), y); // move down
- }else { }
-
- //------------- wheel -------------//
- if (wheel < 0)
- {
- printf(ANSI_SCROLL_UP(%d), (-wheel)); // scroll up
- }else if (wheel > 0)
- {
- printf(ANSI_SCROLL_DOWN(%d), wheel); // scroll down
- }else { }
-}
-
-static inline void process_mouse_report(hid_mouse_report_t const * p_report)
-{
- static hid_mouse_report_t prev_report = { 0 };
-
- //------------- button state -------------//
- uint8_t button_changed_mask = p_report->buttons ^ prev_report.buttons;
- if ( button_changed_mask & p_report->buttons)
- {
- printf(" %c%c%c ",
- p_report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-',
- p_report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-',
- p_report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-');
- }
-
- //------------- cursor movement -------------//
- cursor_movement(p_report->x, p_report->y, p_report->wheel);
-}
-
-void tuh_hid_get_report_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len)
-{
- process_kbd_report( (hid_keyboard_report_t*) report );
-}
-
-void hid_task(void)
-{
-}
-
-//--------------------------------------------------------------------+
-// tinyusb callbacks
+// TinyUSB Callbacks
//--------------------------------------------------------------------+
//--------------------------------------------------------------------+
-// BLINKING TASK
+// Blinking Task
//--------------------------------------------------------------------+
void led_blinking_task(void)
{