Changeset 2020927 in mainline for uspace/lib/usb/src/hidparser.c


Ignore:
Timestamp:
2011-04-21T21:35:33Z (13 years ago)
Author:
Matej Klonfar <maklf@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1553cbf
Parents:
c7c0984a
Message:

HID parser should better support Usages in Reports fixed

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/src/hidparser.c

    rc7c0984a r2020927  
    7373void usb_hid_print_usage_path(usb_hid_report_path_t *path);
    7474void usb_hid_descriptor_print_list(link_t *head);
    75 int usb_hid_report_reset_local_items();
     75void usb_hid_report_reset_local_items(usb_hid_report_item_t *report_item);
    7676void usb_hid_free_report_list(link_t *head);
    7777usb_hid_report_item_t *usb_hid_report_item_clone(const usb_hid_report_item_t *item);
     
    144144        }
    145145
     146        for(i=0; i<report_item->usages_count; i++){
     147                usb_log_debug("usages (%d) - %x\n", i, report_item->usages[i]);
     148        }
     149
    146150       
    147151        for(i=0; i<report_item->count; i++){
     
    168172
    169173                if(report_item->usages_count > 0 && ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) {
    170                         if(i < report_item->usages_count){
    171                                 if((report_item->usages[i] & 0xFF00) != 0){
    172                                         field->usage_page = (report_item->usages[i] >> 16);                                     
    173                                         field->usage = (report_item->usages[i] & 0xFF);
     174                        uint32_t usage;
     175                        if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
     176                                if(i < report_item->usages_count){
     177                                        usage = report_item->usages[i];
    174178                                }
    175179                                else {
    176                                         field->usage = report_item->usages[i];
     180                                        usage = report_item->usages[report_item->usages_count - 1];
    177181                                }
    178182                        }
    179183                        else {
    180                                 field->usage = report_item->usages[report_item->usages_count - 1];
    181                         }
     184                                if((report_item->count - i - 1) < report_item->usages_count){
     185                                        usage = report_item->usages[(report_item->count - i - 1)];
     186                                }
     187                                else {
     188                                        usage = report_item->usages[report_item->usages_count - 1];
     189                                }
     190                        }
     191
     192                                               
     193                        if((usage & 0xFF00) != 0){
     194                                field->usage_page = (usage >> 16);                                     
     195                                field->usage = (usage & 0xFF);
     196                        }
     197                        else {
     198                                field->usage = usage;
     199                        }
     200
     201                       
    182202                }       
    183203
     
    342362
    343363                                        /* reset local items */
    344                                         while(report_item->usages_count > 0){
    345                                                 report_item->usages[--(report_item->usages_count)] = 0;
    346                                         }
    347 
    348                                         report_item->extended_usage_page = 0;
    349                                         report_item->usage_minimum = 0;
    350                                         report_item->usage_maximum = 0;
    351                                         report_item->designator_index = 0;
    352                                         report_item->designator_minimum = 0;
    353                                         report_item->designator_maximum = 0;
    354                                         report_item->string_index = 0;
    355                                         report_item->string_minimum = 0;
    356                                         report_item->string_maximum = 0;
     364                                        usb_hid_report_reset_local_items (report_item);
    357365
    358366                                        break;
     
    476484                        // TODO usage_path->flags = *data;
    477485                        usb_hid_report_path_append_item(usage_path, report_item->usage_page, report_item->usages[report_item->usages_count-1]);                                         
     486                        usb_hid_report_reset_local_items (report_item);
    478487                        return USB_HID_NO_ACTION;
    479488                        break;
     
    567576        {
    568577                case USB_HID_REPORT_TAG_USAGE:
    569                         report_item->usages[report_item->usages_count++] = usb_hid_report_tag_data_int32(data,item_size);
     578                        report_item->usages[report_item->usages_count] = usb_hid_report_tag_data_int32(data,item_size);
     579                        report_item->usages_count++;
    570580                        break;
    571581                case USB_HID_REPORT_TAG_USAGE_MINIMUM:
     
    16831693}
    16841694
    1685 
     1695void usb_hid_report_reset_local_items(usb_hid_report_item_t *report_item)
     1696{
     1697        if(report_item == NULL) {
     1698                return;
     1699        }
     1700       
     1701        report_item->usages_count = 0;
     1702        memset(report_item->usages, 0, USB_HID_MAX_USAGES);
     1703       
     1704        report_item->extended_usage_page = 0;
     1705        report_item->usage_minimum = 0;
     1706        report_item->usage_maximum = 0;
     1707        report_item->designator_index = 0;
     1708        report_item->designator_minimum = 0;
     1709        report_item->designator_maximum = 0;
     1710        report_item->string_index = 0;
     1711        report_item->string_minimum = 0;
     1712        report_item->string_maximum = 0;
     1713
     1714        return;
     1715}
    16861716/**
    16871717 * @}
Note: See TracChangeset for help on using the changeset viewer.