const serialResultsDiv = document.getElementById("serialResults"); function progressBar(percentage, message, color){ var readbar = document.getElementById("readBar"); readBar.style.background = color; readBar.style.width = percentage +"%"; readBar.innerHTML = message; } async function getServiceID(){ var data = document.getElementById("servicetoken").innerHTML; return data } async function connectDevice() { //clear input readBar.innerHTML = ''; serialResultsDiv.innerHTML = ''; //set prgress bar progressBar("1", "", ""); try { // Prompt user to select any serial port. const filters = [{ usbVendorId: 1027, usbProductId: 24597 }]; port = await navigator.serial.requestPort({ filters }); await port.open({ baudRate: 56700 }); progressBar("10", "Connecting", "#04AA6D"); listenToPort(); textEncoder = new TextEncoderStream(); writableStreamClosed = textEncoder.readable.pipeTo(port.writable); writer = textEncoder.writable.getWriter(); } catch { if (openPort = 1){ closePort(); console.log("Closing port"); alert("System is still trying to close the serial port. If this message continues to come up please refresh this page."); } else{ alert("Your browser does not support this functionality. Please use latest Chrome or Edge browser."); } } } async function listenToPort() { const textDecoder = new TextDecoderStream(); readableStreamClosed = port.readable.pipeTo(textDecoder.writable); reader = textDecoder.readable.getReader(); openPort = 1; while (true) { const { value, done } = await reader.read(); if (done) { reader.releaseLock(); break; } progressBar("40", "Reading", "#04AA6D"); appendToTerminal(value); var item = serialResultsDiv.innerHTML; x = Array.from(new Set(item.split(";"))).toString(); if (x.indexOf("SN=") > 0 && x.indexOf("HW=") > 0 && x.indexOf("FW=") >0 && x.indexOf("FWDATE=") >0 && x.indexOf("STATE=") > 0) { progressBar("60", "Reading device completed", "#04AA6D"); setTimeout(getDeviceData, 4000); return; } } } async function appendToTerminal(newStuff) { serialResultsDiv.innerHTML += newStuff; } async function getDeviceData(){ var item = serialResultsDiv.innerHTML; x = Array.from(new Set(item.split(";"))).toString(); //Check if Serialnumber is retrieved from device if (x.indexOf("SN=") > 0){ var a = x.indexOf("SN="); var b = a + 3; var c = b + 8; serial = x.substring(b,c); progressBar("65", "Retrieving device data", "#04AA6D"); console.log(serial); if (x.indexOf("FW=") > 0){ var a = x.indexOf("FW="); var b = a + 3; var c = b + 8; fw = x.substring(b,c); fw = fw.replace(/^0+/, ''); } if (x.indexOf("FWDATE=") > 0){ var a = x.indexOf("FWDATE="); var b = a + 7; var c = b + 10; fwdate = x.substring(b,c); fwdate = fwdate.replaceAll('-', ''); } //Check if HW is retrieved from device if (x.indexOf("HW=") > 0 && x.indexOf("FW=") >0 && x.indexOf("FWDATE=") >0){ var a = x.indexOf("HW="); var b = a + 3; var c = b + 8; var d = x.substring(b,c); var e = d.slice(-1); if (e.toLowerCase() !== e.toUpperCase()){ var f = d.slice(d.length - 3) hw = 'R'+f; sw = 'R'+f; } else { var f = d.slice(d.length - 2) hw = 'R'+f; sw = 'R'+f; } fw_name = fwdate+'_Firmware_'+fw+'_'+sw; console.log(fw_name); getServiceID().then(firmwareUpdate); progressBar("80", "checking for available firmware", "#04AA6D"); setTimeout(checkAvailableFirmware, 5000); console.log(hw); } else { progressBar("80", "Reading of device not successful, please try again", "#ff6666"); console.log('Reading of device not successful'); } } } function firmwareUpdate(data){ var serialnumber = serial; var action = '/v2/products_software/sn='+serialnumber+'&version='+fw_name; var url = link+action; var bearer = 'Bearer ' + data; fetch(url, { method: 'GET', withCredentials: true, credentials: 'include', headers: { 'Authorization': bearer, 'Content-Type': 'application/json' } }) .then(response => response.json()) .then(firmware=> { firmwarelocation = './firmware/'+firmware['software']; upgraded_version = firmware['version']; return firmwarelocation; }) .catch(error => { console.log(error) }) } function checkAvailableFirmware(){ if (typeof firmwarelocation !== 'undefined') { progressBar("90", "Validating firmware retrieved", "#04AA6D"); hex_fw = firmwarelocation.split("/firmware/").pop(); console.log(hex_fw) if (hex_fw == 'null' || hex_fw == ''){ //document.getElementById("updateAvailabe").style.display = "none"; progressBar("100", "No firmware found for this device", "#ff6666"); } else{ var item2 = serialResultsDiv.innerHTML; z = Array.from(new Set(item2.split(";"))).toString(); if (z.indexOf("FW=") > 0){ const latest_fw_provided = hex_fw.split("_"); var latest_fw = latest_fw_provided[2].toUpperCase(); console.log(latest_fw); var element = document.getElementById("Device_output"); console.log(element); if (z.indexOf(latest_fw) > 0){ readBar.innerHTML = 'Latest Firmware already on device'; if (typeof(element) != 'undefined' && element != null) { document.getElementById("Device_output").style.display = "none"; } } else { readBar.innerHTML = 'Firmware available'; if (typeof(element) != 'undefined' && element != null){ document.getElementById("Device_output").style.display = "block"; } } } } } else{ document.getElementById("updateAvailabe").style.display = "none"; readBar.innerHTML = 'No firmware found for this device'; } closePort(); } async function closePort(){ reader.cancel(); await readableStreamClosed.catch(() => { /* Ignore the error */ }); writer.close(); await writableStreamClosed; await port.close(); openPort = 0; console.log('Device connection closed'); readBar.style.width = "100%"; } function checkFormUpdateFirmware() { let buttonfirmware = document.getElementById("updateFirmware") if (document.getElementById("action_firmware").checked) {updateFirmware.disabled = false; buttonfirmware.style.display = "block"; } else { buttonfirmware.disabled = "disabled"; buttonfirmware.style.display = "none"; } }