/* * Copyright (c) 2011 Matej Klonfar * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup libusb * @{ */ /** @file * USB HID report descriptor and report data parser */ #ifndef LIBUSB_HIDPATH_H_ #define LIBUSB_HIDPATH_H_ #include <errno.h> #include <usb/hid/hidparser.h> #include <stdint.h> #include <adt/list.h> /* * Flags of usage paths comparison modes. * */ /** Wanted usage path must be exactly the same as the searched one. This * option cannot be combined with the others. */ #define USB_HID_PATH_COMPARE_STRICT 0 /** * Wanted usage path must be the suffix in the searched one. */ #define USB_HID_PATH_COMPARE_END 1 /** * Only usage page are compared along the usage path. This option can be * combined with others. */ #define USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY 2 /** * Searched usage page must be prefix of the other one. */ #define USB_HID_PATH_COMPARE_BEGIN 4 /** * Searched couple of usage page and usage can be anywhere in usage path. * This option is deprecated. */ #define USB_HID_PATH_COMPARE_ANYWHERE 8 /** * Item of usage path structure. Last item of linked list describes one item * in report, the others describe superior Collection tags. Usage and Usage * page of report item can be changed due to data in report. */ typedef struct { /** Usage page of report item. Zero when usage page can be changed. */ uint32_t usage_page; /** Usage of report item. Zero when usage can be changed. */ uint32_t usage; /** Attribute of Collection tag in report descriptor */ uint8_t flags; /** Link to usb_hid_report_path_t.items list */ link_t rpath_items_link; } usb_hid_report_usage_path_t; /** * USB HID usage path structure. */ typedef struct { /** Length of usage path */ int depth; /** Report id. Zero is reserved and means that report id is not used. */ uint8_t report_id; /** Link to usb_hid_report_path_t.collection_paths list. */ link_t cpath_link; /** List of usage path items. */ list_t items; /* of usb_hid_report_usage_path_t */ } usb_hid_report_path_t; usb_hid_report_path_t *usb_hid_report_path(void); void usb_hid_report_path_free(usb_hid_report_path_t *path); errno_t usb_hid_report_path_set_report_id(usb_hid_report_path_t *usage_path, uint8_t report_id); errno_t usb_hid_report_path_append_item(usb_hid_report_path_t *usage_path, int32_t usage_page, int32_t usage); void usb_hid_report_remove_last_item(usb_hid_report_path_t *usage_path); void usb_hid_report_null_last_item(usb_hid_report_path_t *usage_path); void usb_hid_report_set_last_item(usb_hid_report_path_t *usage_path, int32_t tag, int32_t data); int usb_hid_report_compare_usage_path(usb_hid_report_path_t *report_path, usb_hid_report_path_t *path, int flags); usb_hid_report_path_t *usb_hid_report_path_clone( usb_hid_report_path_t *usage_path); void usb_hid_print_usage_path(usb_hid_report_path_t *path); #endif /** * @} */