diff --git a/lib/gui/app/app.js b/lib/gui/app/app.js index 0912227a..a8c30eae 100644 --- a/lib/gui/app/app.js +++ b/lib/gui/app/app.js @@ -232,6 +232,60 @@ app.run(() => { }) }) +/** + * @summary The radix used by USB ID numbers + * @type {Number} + * @constant + */ +const USB_ID_RADIX = 16 + +/** + * @summary The expected length of a USB ID number + * @type {Number} + * @constant + */ +const USB_ID_LENGTH = 4 + +/** + * @summary Convert a USB id (e.g. product/vendor) to a string + * @function + * @private + * + * @param {Number} id - USB id + * @returns {String} string id + * + * @example + * console.log(usbIdToString(2652)) + * > '0x0a5c' + */ +const usbIdToString = (id) => { + return `0x${_.padStart(id.toString(USB_ID_RADIX), USB_ID_LENGTH, '0')}` +} + +/** + * @summary Product ID of BCM2708 + * @type {Number} + * @constant + */ +const USB_PRODUCT_ID_BCM2708_BOOT = 0x2763 + +/** + * @summary Product ID of BCM2710 + * @type {Number} + * @constant + */ +const USB_PRODUCT_ID_BCM2710_BOOT = 0x2764 + +/** + * @summary Compute module descriptions + * @type {Object} + * @constant + */ +const COMPUTE_MODULE_DESCRIPTIONS = { + [USB_PRODUCT_ID_BCM2708_BOOT]: 'Compute Module 1', + [USB_PRODUCT_ID_BCM2710_BOOT]: 'Compute Module 3' +} + app.run(($timeout) => { const BLACKLISTED_DRIVES = settings.has('driveBlacklist') ? settings.get('driveBlacklist').split(',') @@ -259,6 +313,27 @@ app.run(($timeout) => { updateDriveProgress(drive, progress) }) return drive + } else if (drive instanceof sdk.sourceDestination.DriverlessDevice) { + const description = COMPUTE_MODULE_DESCRIPTIONS[drive.deviceDescriptor.idProduct] || 'Compute Module' + return { + device: `${usbIdToString(drive.deviceDescriptor.idVendor)}:${usbIdToString(drive.deviceDescriptor.idProduct)}`, + displayName: 'Missing drivers', + description, + mountpoints: [], + isReadOnly: false, + isSystem: false, + disabled: true, + icon: 'warning', + size: null, + link: 'https://www.raspberrypi.org/documentation/hardware/computemodule/cm-emmc-flashing.md', + linkCTA: 'Install', + linkTitle: 'Install missing drivers', + linkMessage: [ + 'Would you like to download the necessary drivers from the Raspberry Pi Foundation?', + 'This will open your browser.\n\n', + 'Once opened, download and run the installer from the "Windows Installer" section to install the drivers.' + ].join(' ') + } } }