| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview Implements a low-level gnubby driver based on chrome.usb. | 6 * @fileoverview Implements a low-level gnubby driver based on chrome.usb. |
| 7 */ | 7 */ |
| 8 'use strict'; | 8 'use strict'; |
| 9 | 9 |
| 10 /** | 10 /** |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 70 |
| 71 if (this.lockTID) { | 71 if (this.lockTID) { |
| 72 window.clearTimeout(this.lockTID); | 72 window.clearTimeout(this.lockTID); |
| 73 this.lockTID = null; | 73 this.lockTID = null; |
| 74 } | 74 } |
| 75 | 75 |
| 76 var dev = this.dev; | 76 var dev = this.dev; |
| 77 this.dev = null; | 77 this.dev = null; |
| 78 | 78 |
| 79 chrome.usb.releaseInterface(dev, 0, function() { | 79 chrome.usb.releaseInterface(dev, 0, function() { |
| 80 if (chrome.runtime.lastError) { |
| 81 console.warn(UTIL_fmt('Device ' + dev.handle + |
| 82 ' couldn\'t be released:')); |
| 83 console.warn(chrome.runtime.lastError); |
| 84 return; |
| 85 } |
| 80 console.log(UTIL_fmt('Device ' + dev.handle + ' released')); | 86 console.log(UTIL_fmt('Device ' + dev.handle + ' released')); |
| 81 chrome.usb.closeDevice(dev, function() { | 87 chrome.usb.closeDevice(dev, function() { |
| 88 if (chrome.runtime.lastError) { |
| 89 console.warn(UTIL_fmt('Device ' + dev.handle + |
| 90 ' couldn\'t be closed:')); |
| 91 console.warn(chrome.runtime.lastError); |
| 92 return; |
| 93 } |
| 82 console.log(UTIL_fmt('Device ' + dev.handle + ' closed')); | 94 console.log(UTIL_fmt('Device ' + dev.handle + ' closed')); |
| 83 }); | 95 }); |
| 84 }); | 96 }); |
| 85 }; | 97 }; |
| 86 | 98 |
| 87 /** | 99 /** |
| 88 * Push frame to all clients. | 100 * Push frame to all clients. |
| 89 * @param {ArrayBuffer} f Data frame | 101 * @param {ArrayBuffer} f Data frame |
| 90 * @private | 102 * @private |
| 91 */ | 103 */ |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 * @param {number} cmd Command to be sent | 281 * @param {number} cmd Command to be sent |
| 270 * @return {boolean} true if not locked for this request. | 282 * @return {boolean} true if not locked for this request. |
| 271 * @private | 283 * @private |
| 272 */ | 284 */ |
| 273 UsbGnubbyDevice.prototype.checkLock_ = function(cid, cmd) { | 285 UsbGnubbyDevice.prototype.checkLock_ = function(cid, cmd) { |
| 274 if (this.lockCID) { | 286 if (this.lockCID) { |
| 275 // We have an active lock. | 287 // We have an active lock. |
| 276 if (this.lockCID != cid) { | 288 if (this.lockCID != cid) { |
| 277 // Some other channel has active lock. | 289 // Some other channel has active lock. |
| 278 | 290 |
| 279 if (cmd != GnubbyDevice.CMD_SYNC) { | 291 if (cmd != GnubbyDevice.CMD_SYNC && |
| 280 // Anything but SYNC gets an immediate busy. | 292 cmd != GnubbyDevice.CMD_INIT) { |
| 293 // Anything but SYNC|INIT gets an immediate busy. |
| 281 var busy = new Uint8Array( | 294 var busy = new Uint8Array( |
| 282 [(cid >> 24) & 255, | 295 [(cid >> 24) & 255, |
| 283 (cid >> 16) & 255, | 296 (cid >> 16) & 255, |
| 284 (cid >> 8) & 255, | 297 (cid >> 8) & 255, |
| 285 cid & 255, | 298 cid & 255, |
| 286 GnubbyDevice.CMD_ERROR, | 299 GnubbyDevice.CMD_ERROR, |
| 287 0, 1, // length | 300 0, 1, // length |
| 288 GnubbyDevice.BUSY]); | 301 GnubbyDevice.BUSY]); |
| 289 // Log the synthetic busy too. | 302 // Log the synthetic busy too. |
| 290 console.log(UTIL_fmt('<' + UTIL_BytesToHex(busy))); | 303 console.log(UTIL_fmt('<' + UTIL_BytesToHex(busy))); |
| 291 this.publishFrame_(busy.buffer); | 304 this.publishFrame_(busy.buffer); |
| 292 return false; | 305 return false; |
| 293 } | 306 } |
| 294 | 307 |
| 295 // SYNC gets to go to the device to flush OS tx/rx queues. | 308 // SYNC|INIT get to go to the device to flush OS tx/rx queues. |
| 296 // The usb firmware always responds to SYNC, regardless of lock status. | 309 // The usb firmware is to always respond to SYNC|INIT, |
| 310 // regardless of lock status. |
| 297 } | 311 } |
| 298 } | 312 } |
| 299 return true; | 313 return true; |
| 300 }; | 314 }; |
| 301 | 315 |
| 302 /** | 316 /** |
| 303 * Update or grab lock. | 317 * Update or grab lock. |
| 304 * @param {number} cid Channel id | 318 * @param {number} cid Channel id |
| 305 * @param {number} cmd Command | 319 * @param {number} cmd Command |
| 306 * @param {number} arg Command argument | 320 * @param {number} arg Command argument |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 * @param {Gnubbies} gnubbies The gnubbies instances this device is enumerated | 446 * @param {Gnubbies} gnubbies The gnubbies instances this device is enumerated |
| 433 * in. | 447 * in. |
| 434 * @param {number} which The index of the device to open. | 448 * @param {number} which The index of the device to open. |
| 435 * @param {!chrome.usb.Device} dev The device to open. | 449 * @param {!chrome.usb.Device} dev The device to open. |
| 436 * @param {function(number, GnubbyDevice=)} cb Called back with the | 450 * @param {function(number, GnubbyDevice=)} cb Called back with the |
| 437 * result of opening the device. | 451 * result of opening the device. |
| 438 */ | 452 */ |
| 439 UsbGnubbyDevice.open = function(gnubbies, which, dev, cb) { | 453 UsbGnubbyDevice.open = function(gnubbies, which, dev, cb) { |
| 440 /** @param {chrome.usb.ConnectionHandle=} handle Connection handle */ | 454 /** @param {chrome.usb.ConnectionHandle=} handle Connection handle */ |
| 441 function deviceOpened(handle) { | 455 function deviceOpened(handle) { |
| 442 if (!handle) { | 456 if (chrome.runtime.lastError) { |
| 443 console.warn(UTIL_fmt('failed to open device. permissions issue?')); | 457 console.warn(UTIL_fmt('failed to open device. permissions issue?')); |
| 444 cb(-GnubbyDevice.NODEVICE); | 458 cb(-GnubbyDevice.NODEVICE); |
| 445 return; | 459 return; |
| 446 } | 460 } |
| 447 var nonNullHandle = /** @type {!chrome.usb.ConnectionHandle} */ (handle); | 461 var nonNullHandle = /** @type {!chrome.usb.ConnectionHandle} */ (handle); |
| 448 chrome.usb.listInterfaces(nonNullHandle, function(descriptors) { | 462 chrome.usb.listInterfaces(nonNullHandle, function(descriptors) { |
| 449 var inEndpoint, outEndpoint; | 463 var inEndpoint, outEndpoint; |
| 450 for (var i = 0; i < descriptors.length; i++) { | 464 for (var i = 0; i < descriptors.length; i++) { |
| 451 var descriptor = /** @type {InterfaceDescriptor} */ (descriptors[i]); | 465 var descriptor = /** @type {InterfaceDescriptor} */ (descriptors[i]); |
| 452 for (var j = 0; j < descriptor.endpoints.length; j++) { | 466 for (var j = 0; j < descriptor.endpoints.length; j++) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 */ | 540 */ |
| 527 UsbGnubbyDevice.register = function(gnubbies) { | 541 UsbGnubbyDevice.register = function(gnubbies) { |
| 528 var USB_GNUBBY_IMPL = { | 542 var USB_GNUBBY_IMPL = { |
| 529 isSharedAccess: false, | 543 isSharedAccess: false, |
| 530 enumerate: UsbGnubbyDevice.enumerate, | 544 enumerate: UsbGnubbyDevice.enumerate, |
| 531 deviceToDeviceId: UsbGnubbyDevice.deviceToDeviceId, | 545 deviceToDeviceId: UsbGnubbyDevice.deviceToDeviceId, |
| 532 open: UsbGnubbyDevice.open | 546 open: UsbGnubbyDevice.open |
| 533 }; | 547 }; |
| 534 gnubbies.registerNamespace(UsbGnubbyDevice.NAMESPACE, USB_GNUBBY_IMPL); | 548 gnubbies.registerNamespace(UsbGnubbyDevice.NAMESPACE, USB_GNUBBY_IMPL); |
| 535 }; | 549 }; |
| OLD | NEW |