NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Royal Mail Dymo USB Scale Connector
// @version 1
// @grant none
// @match https://business.parcel.royalmail.com/orders/
// @require http://code.jquery.com/jquery-latest.js
// @license MIT
// ==/UserScript==
/* globals $ */
/* References
* http://steventsnyder.com/reading-a-dymo-usb-scale-using-python/
* https://blog.scottlogic.com/2019/04/03/upcoming-webhid-api.html
*
*/
(function() {
'use strict';
$( document ).ready(() => {
console.log('initialising dymo');
if (!navigator.hid) {
console.log('Browser does not support webHID. Please enable Experimental Web Platform features');
return;
}
setInterval(addDymoButton, 200);
});
function addDymoButton() {
if ($('.package-weight #btnDymo').length > 0) {
return;
}
$('.package-weight label[for=packageWeight] span:first').append(`
<span id="btnDymo">D</span>
<style>
#btnDymo { display:inline-block; width:15px; height:15px; text-align:center; cursor:pointer; vertical-align:bottom; border:1px solid #900; background-color:#fbb; }
</style>
`);
$('#btnDymo').click(async () => toggleDymo());
}
let dymoEnabled;
async function toggleDymo() {
try {
if (dymoEnabled) {
dymoEnabled = false;
} else {
await connectToDymo();
}
} catch (error) {
console.log("error connecting to dymo", error);
} finally {
updateDymoStatus();
}
}
function updateDymoStatus() {
if (dymoEnabled) {
$('#btnDymo').css({'background-color':'#bfb', 'border-color':'#090'});
} else {
$('#btnDymo').css({'background-color':'#fbb', 'border-color':'#900'});
}
}
async function connectToDymo() {
/* These should work, but don't although it doesn't really seem to matter ...
navigator.hid.addEventListener('connect', (event) => {
console.log("deviceConnected", event);
});
navigator.hid.addEventListener('disconnect', (event) => {
console.log("deviceDisConnected", event);
});*/
let devices = await navigator.hid.getDevices();
let device = devices.find(d => d.vendorId === 0x0922);
if (!device) {
//don't already have permission so ask for it.
devices = await navigator.hid.requestDevice({ filters: [{ vendorId: 0x0922 }] });
device = devices[0];
}
if (device.opened === false) {
await device.open(); // Begin a session
}
//$('#btnDymo').css({'background-color':'#bfb', 'border-color':'#090'});
dymoEnabled = true;
device.addEventListener('inputreport', event => {
const i0 = event.data.getUint8(0),
i1 = event.data.getUint8(1),
i2 = event.data.getUint8(2),
i3 = event.data.getUint8(3),
i4 = event.data.getUint8(4);
//console.log("i", i0, i1, i2, i3, i4);
const weight = i3 + (i4*256);
if (dymoEnabled) {
$('#packageWeight').val(weight);
}
});
}
})();