Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/hid/usbhid/mouse/mousedev.c

    re0a5d4c rb7fd2a0  
    11/*
    22 * Copyright (c) 2011 Lubos Slovak, Vojtech Horky
    3  * Copyright (c) 2018 Ondrej Hlavaty
    43 * All rights reserved.
    54 *
     
    119118
    120119        if (mouse_dev == NULL) {
    121                 usb_log_debug("%s: Missing parameters.", __FUNCTION__);
     120                usb_log_debug("%s: Missing parameters.\n", __FUNCTION__);
    122121                async_answer_0(icallid, EINVAL);
    123122                return;
    124123        }
    125124
    126         usb_log_debug("%s: fun->name: %s", __FUNCTION__, ddf_fun_get_name(fun));
    127         usb_log_debug("%s: mouse_sess: %p",
     125        usb_log_debug("%s: fun->name: %s\n", __FUNCTION__, ddf_fun_get_name(fun));
     126        usb_log_debug("%s: mouse_sess: %p\n",
    128127            __FUNCTION__, mouse_dev->mouse_sess);
    129128
     
    133132                if (mouse_dev->mouse_sess == NULL) {
    134133                        mouse_dev->mouse_sess = sess;
    135                         usb_log_debug("Console session to %s set ok (%p).",
     134                        usb_log_debug("Console session to %s set ok (%p).\n",
    136135                            ddf_fun_get_name(fun), sess);
    137136                        async_answer_0(icallid, EOK);
    138137                } else {
    139                         usb_log_error("Console session to %s already set.",
     138                        usb_log_error("Console session to %s already set.\n",
    140139                            ddf_fun_get_name(fun));
    141140                        async_answer_0(icallid, ELIMIT);
     
    143142                }
    144143        } else {
    145                 usb_log_debug("%s: Invalid function.", __FUNCTION__);
     144                usb_log_debug("%s: Invalid function.\n", __FUNCTION__);
    146145                async_answer_0(icallid, EINVAL);
    147146        }
    148147}
    149148
    150 static const usb_hid_report_field_t *get_mouse_axis_move_field(uint8_t rid, usb_hid_report_t *report,
     149static int get_mouse_axis_move_value(uint8_t rid, usb_hid_report_t *report,
    151150    int32_t usage)
    152151{
     152        int result = 0;
     153
    153154        usb_hid_report_path_t *path = usb_hid_report_path();
    154155        usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_GENERIC_DESKTOP,
     
    157158        usb_hid_report_path_set_report_id(path, rid);
    158159
    159         const usb_hid_report_field_t *field = usb_hid_report_get_sibling(
     160        usb_hid_report_field_t *field = usb_hid_report_get_sibling(
    160161            report, NULL, path, USB_HID_PATH_COMPARE_END,
    161162            USB_HID_REPORT_TYPE_INPUT);
    162163
     164        if (field != NULL) {
     165                result = field->value;
     166        }
     167
    163168        usb_hid_report_path_free(path);
    164169
    165         return field;
    166 }
    167 
    168 static void usb_mouse_process_report(usb_hid_dev_t *hid_dev,
     170        return result;
     171}
     172
     173static bool usb_mouse_process_report(usb_hid_dev_t *hid_dev,
    169174    usb_mouse_t *mouse_dev)
    170175{
     
    172177
    173178        if (mouse_dev->mouse_sess == NULL) {
    174                 usb_log_warning(NAME " No console session.");
    175                 return;
    176         }
    177 
    178         const usb_hid_report_field_t *move_x = get_mouse_axis_move_field(
    179             hid_dev->report_id, &hid_dev->report,
    180             USB_HIDUT_USAGE_GENERIC_DESKTOP_X);
    181         const usb_hid_report_field_t *move_y = get_mouse_axis_move_field(
    182             hid_dev->report_id, &hid_dev->report,
    183             USB_HIDUT_USAGE_GENERIC_DESKTOP_Y);
    184         const usb_hid_report_field_t *wheel= get_mouse_axis_move_field(
    185             hid_dev->report_id, &hid_dev->report,
    186             USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL);
    187 
    188         bool absolute_x = move_x && !USB_HID_ITEM_FLAG_RELATIVE(move_x->item_flags);
    189         bool absolute_y = move_y && !USB_HID_ITEM_FLAG_RELATIVE(move_y->item_flags);
    190 
    191         /* Tablet shall always report both X and Y */
    192         if (absolute_x != absolute_y) {
    193                 usb_log_error(NAME " cannot handle mix of absolute and relative mouse move.");
    194                 return;
    195         }
    196 
    197         int shift_x = move_x ? move_x->value : 0;
    198         int shift_y = move_y ? move_y->value : 0;
    199         int shift_z =  wheel ?  wheel->value : 0;
    200 
    201         if (absolute_x && absolute_y) {
    202                 async_exch_t *exch =
    203                     async_exchange_begin(mouse_dev->mouse_sess);
    204                 if (exch != NULL) {
    205                         async_msg_4(exch, MOUSEEV_ABS_MOVE_EVENT,
    206                             shift_x, shift_y, move_x->logical_maximum, move_y->logical_maximum);
    207                         async_exchange_end(exch);
    208                 }
    209 
    210                 // Even if we move the mouse absolutely, we need to resolve wheel
    211                 shift_x = shift_y = 0;
    212         }
    213 
    214 
    215         if (shift_x || shift_y || shift_z) {
     179                usb_log_warning(NAME " No console session.\n");
     180                return true;
     181        }
     182
     183        const int shift_x = get_mouse_axis_move_value(hid_dev->report_id,
     184            &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_X);
     185        const int shift_y = get_mouse_axis_move_value(hid_dev->report_id,
     186            &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_Y);
     187        const int wheel = get_mouse_axis_move_value(hid_dev->report_id,
     188            &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL);
     189
     190        if (shift_x || shift_y || wheel) {
    216191                async_exch_t *exch =
    217192                    async_exchange_begin(mouse_dev->mouse_sess);
    218193                if (exch != NULL) {
    219194                        async_msg_3(exch, MOUSEEV_MOVE_EVENT,
    220                             shift_x, shift_y, shift_z);
     195                            shift_x, shift_y, wheel);
    221196                        async_exchange_end(exch);
    222197                }
     
    226201        usb_hid_report_path_t *path = usb_hid_report_path();
    227202        if (path == NULL) {
    228                 usb_log_warning("Failed to create USB HID report path.");
    229                 return;
     203                usb_log_warning("Failed to create USB HID report path.\n");
     204                return true;
    230205        }
    231206        errno_t ret =
     
    233208        if (ret != EOK) {
    234209                usb_hid_report_path_free(path);
    235                 usb_log_warning("Failed to add buttons to report path.");
    236                 return;
     210                usb_log_warning("Failed to add buttons to report path.\n");
     211                return true;
    237212        }
    238213        usb_hid_report_path_set_report_id(path, hid_dev->report_id);
     
    243218
    244219        while (field != NULL) {
    245                 usb_log_debug2(NAME " VALUE(%X) USAGE(%X)", field->value,
     220                usb_log_debug2(NAME " VALUE(%X) USAGE(%X)\n", field->value,
    246221                    field->usage);
    247222                assert(field->usage > field->usage_minimum);
     
    267242
    268243        usb_hid_report_path_free(path);
     244
     245        return true;
    269246}
    270247
     
    332309
    333310        if (mouse_dev->buttons == NULL) {
    334                 usb_log_error(NAME ": out of memory, giving up on device!");
     311                usb_log_error(NAME ": out of memory, giving up on device!\n");
    335312                free(mouse_dev);
    336313                return ENOMEM;
     
    345322errno_t usb_mouse_init(usb_hid_dev_t *hid_dev, void **data)
    346323{
    347         usb_log_debug("Initializing HID/Mouse structure...");
     324        usb_log_debug("Initializing HID/Mouse structure...\n");
    348325
    349326        if (hid_dev == NULL) {
     
    354331
    355332        /* Create the exposed function. */
    356         usb_log_debug("Creating DDF function %s...", HID_MOUSE_FUN_NAME);
     333        usb_log_debug("Creating DDF function %s...\n", HID_MOUSE_FUN_NAME);
    357334        ddf_fun_t *fun = usb_device_ddf_fun_create(hid_dev->usb_dev,
    358335            fun_exposed, HID_MOUSE_FUN_NAME);
    359336        if (fun == NULL) {
    360                 usb_log_error("Could not create DDF function node `%s'.",
     337                usb_log_error("Could not create DDF function node `%s'.\n",
    361338                    HID_MOUSE_FUN_NAME);
    362339                return ENOMEM;
     
    365342        usb_mouse_t *mouse_dev = ddf_fun_data_alloc(fun, sizeof(usb_mouse_t));
    366343        if (mouse_dev == NULL) {
    367                 usb_log_error("Failed to alloc HID mouse device structure.");
     344                usb_log_error("Failed to alloc HID mouse device structure.\n");
    368345                ddf_fun_destroy(fun);
    369346                return ENOMEM;
     
    372349        errno_t ret = mouse_dev_init(mouse_dev, hid_dev);
    373350        if (ret != EOK) {
    374                 usb_log_error("Failed to init HID mouse device structure.");
     351                usb_log_error("Failed to init HID mouse device structure.\n");
    375352                return ret;
    376353        }
     
    380357        ret = ddf_fun_bind(fun);
    381358        if (ret != EOK) {
    382                 usb_log_error("Could not bind DDF function `%s': %s.",
     359                usb_log_error("Could not bind DDF function `%s': %s.\n",
    383360                    ddf_fun_get_name(fun), str_error(ret));
    384361                ddf_fun_destroy(fun);
     
    386363        }
    387364
    388         usb_log_debug("Adding DDF function `%s' to category %s...",
     365        usb_log_debug("Adding DDF function `%s' to category %s...\n",
    389366            ddf_fun_get_name(fun), HID_MOUSE_CATEGORY);
    390367        ret = ddf_fun_add_to_category(fun, HID_MOUSE_CATEGORY);
     
    413390
    414391        usb_mouse_t *mouse_dev = data;
    415         usb_mouse_process_report(hid_dev, mouse_dev);
    416 
    417         /* Continue polling until the device is about to be removed. */
    418         return true;
     392
     393        return usb_mouse_process_report(hid_dev, mouse_dev);
    419394}
    420395
     
    445420
    446421        if (rc != EOK) {
    447                 usb_log_error("Failed to parse boot report descriptor: %s",
     422                usb_log_error("Failed to parse boot report descriptor: %s\n",
    448423                    str_error(rc));
    449424                return rc;
Note: See TracChangeset for help on using the changeset viewer.