#include #include "keyboard_hid_report_event.h" #define KEYBOARD_HID_REPORT_EVENT_LOG_BUF_LEN 192 static const char *mode_name(enum mode_switch_mode mode) { switch (mode) { case MODE_SWITCH_USB: return "USB"; case MODE_SWITCH_24G: return "2.4G"; case MODE_SWITCH_BLE: return "BLE"; default: return "?"; } } static const char *report_type_name(enum keyboard_report_type report_type) { switch (report_type) { case KEYBOARD_REPORT_TYPE_KEYS: return "keys"; case KEYBOARD_REPORT_TYPE_CONSUMER: return "consumer"; default: return "?"; } } static const char *protocol_mode_name(enum keyboard_protocol_mode protocol_mode) { switch (protocol_mode) { case KEYBOARD_PROTOCOL_MODE_BOOT: return "boot"; case KEYBOARD_PROTOCOL_MODE_REPORT: return "report"; default: return "?"; } } static const char *queue_policy_name(enum hid_queue_policy queue_policy) { switch (queue_policy) { case HID_QUEUE_POLICY_LATEST: return "latest"; case HID_QUEUE_POLICY_FIFO: return "fifo"; default: return "?"; } } static void log_keyboard_hid_report_event(const struct app_event_header *aeh) { const struct keyboard_hid_report_event *event = cast_keyboard_hid_report_event(aeh); char log_buf[KEYBOARD_HID_REPORT_EVENT_LOG_BUF_LEN]; int pos; pos = snprintf(log_buf, sizeof(log_buf), "mode:%s type:%s protocol:%s queue:%s len:%zu", mode_name(event->mode), report_type_name(event->report_type), protocol_mode_name(event->protocol_mode), queue_policy_name(event->queue_policy), event->dyndata.size); if ((pos > 0) && (pos < sizeof(log_buf))) { for (size_t i = 0; i < event->dyndata.size; i++) { int tmp = snprintf(&log_buf[pos], sizeof(log_buf) - pos, " %02x", event->dyndata.data[i]); if (tmp < 0) { log_buf[sizeof(log_buf) - 2] = '~'; pos = tmp; break; } pos += tmp; if (pos >= sizeof(log_buf)) { break; } } } if (pos < 0) { APP_EVENT_MANAGER_LOG(aeh, "log message preparation failure"); return; } APP_EVENT_MANAGER_LOG(aeh, "%s", log_buf); } static void profile_keyboard_hid_report_event(struct log_event_buf *buf, const struct app_event_header *aeh) { const struct keyboard_hid_report_event *event = cast_keyboard_hid_report_event(aeh); nrf_profiler_log_encode_uint8(buf, event->mode); nrf_profiler_log_encode_uint8(buf, event->report_type); nrf_profiler_log_encode_uint8(buf, event->protocol_mode); nrf_profiler_log_encode_uint8(buf, event->queue_policy); nrf_profiler_log_encode_uint8(buf, (uint8_t)event->dyndata.size); } APP_EVENT_INFO_DEFINE(keyboard_hid_report_event, ENCODE(NRF_PROFILER_ARG_U8, NRF_PROFILER_ARG_U8, NRF_PROFILER_ARG_U8, NRF_PROFILER_ARG_U8, NRF_PROFILER_ARG_U8), ENCODE("mode", "report_type", "protocol_mode", "queue_policy", "len"), profile_keyboard_hid_report_event); APP_EVENT_TYPE_DEFINE(keyboard_hid_report_event, log_keyboard_hid_report_event, &keyboard_hid_report_event_info, APP_EVENT_FLAGS_CREATE( APP_EVENT_TYPE_FLAGS_INIT_LOG_ENABLE));