Changes in uspace/drv/hid/usbhid/mouse/mousedev.c [e0a5d4c:b7fd2a0] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/hid/usbhid/mouse/mousedev.c
re0a5d4c rb7fd2a0 1 1 /* 2 2 * Copyright (c) 2011 Lubos Slovak, Vojtech Horky 3 * Copyright (c) 2018 Ondrej Hlavaty4 3 * All rights reserved. 5 4 * … … 119 118 120 119 if (mouse_dev == NULL) { 121 usb_log_debug("%s: Missing parameters. ", __FUNCTION__);120 usb_log_debug("%s: Missing parameters.\n", __FUNCTION__); 122 121 async_answer_0(icallid, EINVAL); 123 122 return; 124 123 } 125 124 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", 128 127 __FUNCTION__, mouse_dev->mouse_sess); 129 128 … … 133 132 if (mouse_dev->mouse_sess == NULL) { 134 133 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", 136 135 ddf_fun_get_name(fun), sess); 137 136 async_answer_0(icallid, EOK); 138 137 } else { 139 usb_log_error("Console session to %s already set. ",138 usb_log_error("Console session to %s already set.\n", 140 139 ddf_fun_get_name(fun)); 141 140 async_answer_0(icallid, ELIMIT); … … 143 142 } 144 143 } else { 145 usb_log_debug("%s: Invalid function. ", __FUNCTION__);144 usb_log_debug("%s: Invalid function.\n", __FUNCTION__); 146 145 async_answer_0(icallid, EINVAL); 147 146 } 148 147 } 149 148 150 static const usb_hid_report_field_t *get_mouse_axis_move_field(uint8_t rid, usb_hid_report_t *report,149 static int get_mouse_axis_move_value(uint8_t rid, usb_hid_report_t *report, 151 150 int32_t usage) 152 151 { 152 int result = 0; 153 153 154 usb_hid_report_path_t *path = usb_hid_report_path(); 154 155 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_GENERIC_DESKTOP, … … 157 158 usb_hid_report_path_set_report_id(path, rid); 158 159 159 constusb_hid_report_field_t *field = usb_hid_report_get_sibling(160 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 160 161 report, NULL, path, USB_HID_PATH_COMPARE_END, 161 162 USB_HID_REPORT_TYPE_INPUT); 162 163 164 if (field != NULL) { 165 result = field->value; 166 } 167 163 168 usb_hid_report_path_free(path); 164 169 165 return field;166 } 167 168 static voidusb_mouse_process_report(usb_hid_dev_t *hid_dev,170 return result; 171 } 172 173 static bool usb_mouse_process_report(usb_hid_dev_t *hid_dev, 169 174 usb_mouse_t *mouse_dev) 170 175 { … … 172 177 173 178 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) { 216 191 async_exch_t *exch = 217 192 async_exchange_begin(mouse_dev->mouse_sess); 218 193 if (exch != NULL) { 219 194 async_msg_3(exch, MOUSEEV_MOVE_EVENT, 220 shift_x, shift_y, shift_z);195 shift_x, shift_y, wheel); 221 196 async_exchange_end(exch); 222 197 } … … 226 201 usb_hid_report_path_t *path = usb_hid_report_path(); 227 202 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; 230 205 } 231 206 errno_t ret = … … 233 208 if (ret != EOK) { 234 209 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; 237 212 } 238 213 usb_hid_report_path_set_report_id(path, hid_dev->report_id); … … 243 218 244 219 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, 246 221 field->usage); 247 222 assert(field->usage > field->usage_minimum); … … 267 242 268 243 usb_hid_report_path_free(path); 244 245 return true; 269 246 } 270 247 … … 332 309 333 310 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"); 335 312 free(mouse_dev); 336 313 return ENOMEM; … … 345 322 errno_t usb_mouse_init(usb_hid_dev_t *hid_dev, void **data) 346 323 { 347 usb_log_debug("Initializing HID/Mouse structure... ");324 usb_log_debug("Initializing HID/Mouse structure...\n"); 348 325 349 326 if (hid_dev == NULL) { … … 354 331 355 332 /* 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); 357 334 ddf_fun_t *fun = usb_device_ddf_fun_create(hid_dev->usb_dev, 358 335 fun_exposed, HID_MOUSE_FUN_NAME); 359 336 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", 361 338 HID_MOUSE_FUN_NAME); 362 339 return ENOMEM; … … 365 342 usb_mouse_t *mouse_dev = ddf_fun_data_alloc(fun, sizeof(usb_mouse_t)); 366 343 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"); 368 345 ddf_fun_destroy(fun); 369 346 return ENOMEM; … … 372 349 errno_t ret = mouse_dev_init(mouse_dev, hid_dev); 373 350 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"); 375 352 return ret; 376 353 } … … 380 357 ret = ddf_fun_bind(fun); 381 358 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", 383 360 ddf_fun_get_name(fun), str_error(ret)); 384 361 ddf_fun_destroy(fun); … … 386 363 } 387 364 388 usb_log_debug("Adding DDF function `%s' to category %s... ",365 usb_log_debug("Adding DDF function `%s' to category %s...\n", 389 366 ddf_fun_get_name(fun), HID_MOUSE_CATEGORY); 390 367 ret = ddf_fun_add_to_category(fun, HID_MOUSE_CATEGORY); … … 413 390 414 391 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); 419 394 } 420 395 … … 445 420 446 421 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", 448 423 str_error(rc)); 449 424 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.