You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.5 KiB
JavaScript

// updates
const updates_list = [];
async function getUpdateInfo(dev) {
if (updates_list.includes(dev.info.id)) return;
/** @type {string} */
const ver = dev.info.version;
if (!ver || !ver.includes('@')) return;
const namever = ver.split('@', 2);
let proj;
try {
const resp = await fetch("https://raw.githubusercontent.com/"+namever[0]+"/main/project.json", { cache: "no-store" });
proj = await resp.json();
} catch (e) {
return;
}
if (!('builds' in proj) || !('version' in proj) || proj.version === namever[1]) return;
updates_list.push(dev.info.id);
const platform = dev.info.platform;
for (const build of proj.builds) {
if (build.chipFamily === platform)
return {
name: namever[0],
version: proj.version,
notes: proj.notes,
url: build.parts[0].path,
};
{
const text = `${namever[0]} v${proj.version}:\n${proj.notes}\n\n${lang.p_upd}?`;
if (await asyncConfirm(text, lang.p_has_upd + '!')) otaUrl(build.parts[0].path, 'flash');
break;
}
}
}
async function installOta(dev, type, url) {
showPopup('OTA start');
try {
await dev.otaUrl(type, url);
} catch (e) {
showPopupError('[OTA url] ' + getError(e));
return;
}
showPopup('[OTA] ' + lang.done);
}
async function checkUpdates(dev) {
if (!cfg.check_upd) return;
const upd = await getUpdateInfo(dev);
if (!upd) return;
const text = `${upd.name} v${upd.version}:\n${upd.notes}\n\n${lang.p_upd}?`;
if (!await asyncConfirm(text, lang.p_has_upd + '!')) return;
await installOta(dev, 'flash', upd.url);
}
async function otaUrl(url, type) {
if (!await asyncConfirm(lang.fs_upload + ' OTA?'))
return;
await installOta(hub.dev(focused), type, url);
}
async function uploadOta(file, type) {
const dev = hub.dev(focused);
if (!file.name.endsWith(dev.info.ota_t)) {
asyncAlert(lang.wrong_ota + ' .' + dev.info.ota_t);
return;
}
const res = await asyncConfirm(lang.fs_upload + ' OTA ' + type + '?');
if (!res) return;
EL('ota_label').innerHTML = waiter(25, 'var(--font)', false);
EL('ota_upload').value = '';
EL('ota_upload_fs').value = '';
try {
await dev.uploadOta(file, type, perc => {
EL('ota_label').textContent = perc + '%';
});
} catch (e) {
showPopupError('[OTA] ' + getError(e));
EL('ota_label').textContent = lang.error;
return;
}
showPopup('[OTA] ' + lang.done);
EL('ota_label').textContent = lang.done;
}