esp32-nmea2000-obp60/webinstall/install.js

151 lines
5.2 KiB
JavaScript

import {XtermOutputHandler} from "./installUtil.js";
import ESPInstaller from "./installUtil.js";
(function(){
let espLoaderTerminal;
let espInstaller;
let releaseData={};
const addEl=ESPInstaller.addEl; //shorter typing
let showConsole;
let hideConsole;
const enableConsole=(enable,disableBoth)=>{
if (showConsole) showConsole.disabled=!enable || disableBoth;
if (hideConsole) hideConsole.disabled=enable || disableBoth;
}
const showError=(txt)=>{
let hFrame=document.querySelector('.heading');
if (hFrame){
hFrame.textContent=txt;
hFrame.classList.add("error");
}
else{
alert(txt);
}
}
const buildHeading=(user,repo,element)=>{
let hFrame=document.querySelector(element||'.heading');
if (! hFrame) return;
hFrame.textContent='';
let h=addEl('h2',undefined,hFrame,`ESP32 Install ${user}:${repo}`)
}
const checkChip=(chipFamily,assetName)=>{
//for now only ESP32
if (chipFamily != "ESP32"){
throw new Error(`unexpected chip family ${chipFamily}, expected ESP32`);
}
return assetName;
}
const baudRates=[1200,
2400,
4800,
9600,
14400,
19200,
28800,
38400,
57600,
115200,
230400,
460800];
const buildConsoleButtons=(element)=>{
let bFrame=document.querySelector(element||'.console');
if (! bFrame) return;
bFrame.textContent='';
let cLine=addEl('div','buttons',bFrame);
let bSelect=addEl('select','consoleBaud',cLine);
baudRates.forEach((baud)=>{
let v=addEl('option',undefined,bSelect,baud+'');
v.setAttribute('value',baud);
});
bSelect.value=115200;
showConsole=addEl('button','showConsole',cLine,'ShowConsole');
showConsole.addEventListener('click',async()=>{
enableConsole(false);
await espInstaller.startConsole(bSelect.value);
})
hideConsole=addEl('button','hideConsole',cLine,'HideConsole');
hideConsole.addEventListener('click',async()=>{
await espInstaller.stopConsole();
enableConsole(true);
})
}
const buildButtons=(user,repo,element)=>{
let bFrame=document.querySelector(element||'.content');
if (! bFrame) return;
bFrame.textContent='';
if (!releaseData.assets) return;
let version=releaseData.name;
if (! version){
alert("no version found in release data");
return;
}
addEl('div','version',bFrame,`Version: ${version}`);
let items={};
releaseData.assets.forEach((asset)=>{
let name=asset.name;
let base=name.replace(/-all\.bin/,'').replace(/-update\.bin/,'');
if (items[base] === undefined){
items[base]={};
}
let item=items[base];
item.label=base.replace(/-[0-9][0-9]*/,'');
if (name.match(/-update\./)){
item.update=name;
}
else{
item.basic=name;
}
});
for (let k in items){
let item=items[k];
let line=addEl('div','item',bFrame);
addEl('div','itemTitle',line,item.label);
let btLine=addEl('div','buttons',line);
let tb=addEl('button','installButton',line,'Initial');
tb.addEventListener('click',async ()=>{
enableConsole(false,true);
await espInstaller.installClicked(
true,
user,
repo,
version,
4096,
(chip)=>checkChip(chip,item.basic)
)
enableConsole(true);
});
tb=addEl('button','installButton',line,'Update');
tb.addEventListener('click',async ()=>{
enableConsole(false,true);
await espInstaller.installClicked(
false,
user,
repo,
version,
65536,
(chip)=>checkChip(chip,item.update)
)
enableConsole(true);
});
}
}
window.onload = async () => {
if (! ESPInstaller.checkAvailable()){
showError("your browser does not support the ESP flashing (no serial)");
return;
}
let user = window.gitHubUser||ESPInstaller.getParam('user');
let repo = window.gitHubRepo || ESPInstaller.getParam('repo');
if (!user || !repo) {
alert("missing parameter user or repo");
}
try {
espLoaderTerminal = new XtermOutputHandler('terminal');
espInstaller = new ESPInstaller(espLoaderTerminal);
buildHeading(user, repo);
buildConsoleButtons();
releaseData = await espInstaller.getReleaseInfo(user, repo);
buildButtons(user, repo);
} catch(error){alert("unable to query release info for user "+user+", repo "+repo+": "+error)};
}
})();