From 1526d503a2a56389cb45292717c1d611c0936774 Mon Sep 17 00:00:00 2001 From: Paul Kendall Date: Fri, 8 Sep 2023 12:29:28 +1200 Subject: [PATCH] Allow a user to drag-n-drop a custom JSON on the header for flashing a device --- src/index.html | 4 +-- src/js/configure.js | 24 ++++++++++++------ src/js/index.js | 62 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 10 deletions(-) diff --git a/src/index.html b/src/index.html index ec72487..612fd84 100644 --- a/src/index.html +++ b/src/index.html @@ -14,10 +14,10 @@
-

This tool is not supported on Safari browser!

+

This tool is not supported on Safari browser!

-
+
diff --git a/src/js/configure.js b/src/js/configure.js index 33998b4..9b8b8f8 100644 --- a/src/js/configure.js +++ b/src/js/configure.js @@ -193,7 +193,22 @@ export class Configure { const list = [] const version = document.getElementById('version').value const folder = `firmware/${version}` - const hardwareLayoutFile = await this.#fetch_file(`${folder}/hardware/${deviceType}/${config.layout_file}`, 0) + + var hardwareLayoutData + if (config.custom_layout) { + hardwareLayoutData = this.#bstrToUi8(JSON.stringify(config.custom_layout)) + } else { + const hardwareLayoutFile = await this.#fetch_file(`${folder}/hardware/${deviceType}/${config.layout_file}`, 0) + if (config.overlay === undefined) { + hardwareLayoutData = hardwareLayoutFile.data + } else { + hardwareLayoutData = this.#bstrToUi8(JSON.stringify({ + ...JSON.parse(this.#ui8ToBstr(hardwareLayoutFile.data)), + ...config.overlay + })) + } + } + if (config.platform === 'esp32') { list.push(this.#fetch_file(firmwareUrl.replace('firmware.bin', 'bootloader.bin'), 0x1000)) list.push(this.#fetch_file(firmwareUrl.replace('firmware.bin', 'partitions.bin'), 0x8000)) @@ -204,13 +219,6 @@ export class Configure { } const files = await Promise.all(list) - if (config.overlay === undefined) { - config.overlay = {} - } - const hardwareLayoutData = this.#bstrToUi8(JSON.stringify({ - ...JSON.parse(this.#ui8ToBstr(hardwareLayoutFile.data)), - ...config.overlay - })) var logoFile = { data: new Uint8Array(0), address: 0 } if (config.logo_file !== undefined) { logoFile = await this.#fetch_file(`${folder}/hardware/logo/${config.logo_file}`, 0) diff --git a/src/js/index.js b/src/js/index.js index fcd10d6..97c6f72 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -251,6 +251,7 @@ function initialise () { selected = false } versionSelect.onchange() + initFiledrag() } versionSelect.onchange = async () => { @@ -809,3 +810,64 @@ function abortHandler (event) { html: event.target.responseText }) } + +// Allow dropping of JSON file on "Next" button + +function fileDragHover(e) { + e.stopPropagation() + e.preventDefault() + if (e.type == 'dragenter') + e.target.classList.add('hover') + else + e.target.classList.remove('hover') +} + +async function fileSelectHandler(e) { + fileDragHover(e) + const files = e.target.files || e.dataTransfer.files + for (let i = 0, f; f = files[i]; i++) { + parseFile(f) + } +} + +async function parseFile(file) { + const reader = new FileReader() + reader.onload = async function(e) { + const customLayout = JSON.parse(e.target.result) + SwalMUI.select({ + title: 'Select device type to flash', + inputOptions: [ + 'ESP32 2.4GHz TX', + 'ESP32 2.4GHz RX', + 'ESP32 900GHz TX', + 'ESP32 900GHz RX', + 'ESP8285 2.4GHz TX', + 'ESP8285 2.4GHz RX', + 'ESP8285 900GHz TX', + 'ESP8285 900GHz RX', + ] + }).then((p) => { + var v = p.value + const platform = (v<4) ? 'esp32' : 'esp8285' + selectedModel = { + product_name: "Custom Target", + lua_name: "Custom", + upload_methods: (v%2 === 0) ? ["uart", "etx", "wifi"] :["uart", "betaflight", "wifi"], + platform: platform, + firmware: `Unified_${platform.toUpperCase()}_${((v/2)%2)===0 ? '2400' : '900'}_${(v%2 === 0) ? 'TX' : 'RX'}`, + custom_layout: customLayout + } + typeSelect.value = `${(v%2 === 0) ? 'tx' : 'rx'}_${((v/2)%2)===0 ? '2400' : '900'}` + deviceNext.onclick(e) + }) + } + reader.readAsText(file) +} + +function initFiledrag() { + const filedrag = _('custom-drop') + filedrag.addEventListener('dragover', fileDragHover, false) + filedrag.addEventListener('dragenter', fileDragHover, false) + filedrag.addEventListener('dragleave', fileDragHover, false) + filedrag.addEventListener('drop', fileSelectHandler, false) +}