diff --git a/locales/en/messages.json b/locales/en/messages.json index 82bbf005..b85c0f72 100644 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -2813,7 +2813,12 @@ "message": "HEX file appears to be corrupted" }, "firmwareFlasherConfigCorrupted": { - "message": "Config file appears to be corrupted, ASCII accepted (chars 0-127)" + "message": "Config file appears to be corrupted, ASCII accepted (chars 0-255)", + "description": "shown in the progress bar at the bottom, be brief" + }, + "firmwareFlasherConfigCorruptedLogMessage": { + "message": "Config file appears to be corrupted, ASCII accepted (chars 0-255), characters outside of this range are allowed as comments", + "description": "shown in the log, more wordy" }, "firmwareFlasherRemoteFirmwareLoaded": { "message": "Remote Firmware loaded, ready for flashing" diff --git a/src/js/tabs/firmware_flasher.js b/src/js/tabs/firmware_flasher.js index 2fc28445..77a5bb29 100644 --- a/src/js/tabs/firmware_flasher.js +++ b/src/js/tabs/firmware_flasher.js @@ -587,11 +587,27 @@ TABS.firmware_flasher.initialize = function (callback) { self.flashingMessage(i18n.getMessage('firmwareFlasherFirmwareLocalLoaded', self.parsed_hex.bytes_total), self.FLASH_MESSAGE_TYPES.NEUTRAL); } } - function checkAsciiLimits(input) { + function cleanUnifiedConfigFile(input) { + let output = []; + let inComment = false; for (let i=0; i < input.length; i++) { - if (input.charCodeAt(i) > 127) { return false; } + if (input.charAt(i) == "\n" || input.charAt(i) == "\r") { + inComment = false; + } + if (input.charAt(i) == "#") { + inComment = true; + } + if (!inComment && input.charCodeAt(i) > 255) { + // Note: we're not showing this error in betaflight-configurator + throw new Error('commands are limited to characters 0-255, comments have no limitation'); + } + if (input.charCodeAt(i) > 255) { + output.push('_'); + } else { + output.push(input.charAt(i)); + } } - return true; + return output.join(''); } // UI Hooks $('a.load_file').click(function () { @@ -647,13 +663,14 @@ TABS.firmware_flasher.initialize = function (callback) { }); } else { clearBufferedFirmware(); - if (checkAsciiLimits(e.target.result)) { - self.unifiedTargetConfig = e.target.result; + try { + self.unifiedTargetConfig = cleanUnifiedConfigFile(e.target.result); self.unifiedTargetConfigName = file.name; self.isConfigLocal = true; flashingMessageLocal(); - } else { + } catch(err) { self.flashingMessage('firmwareFlasherConfigCorrupted', self.FLASH_MESSAGE_TYPES.INVALID); + GUI.log(i18n.getMessage('firmwareFlasherConfigCorruptedLogMessage')); } } }