let boards = [];
let selectedBoard = {};
let selectedVersion = '';
fetch('/firmware/firmware.json')
.then(r => r.json())
.then(data => {
boards = data;
showFirmwareAccordion(boards);
});
async function showFirmwareAccordion(boards) {
const accordion = document.getElementById('firmwareAccordion');
boards.forEach((board, idx) => {
const items = board.versions.map(version => {
if (board.architecture === 'nrf52') {
return renderNRF52Item(board.hwModelSlug, version);
}
if (board.architecture === 'esp32') {
return renderESP32Item(board.hwModelSlug, version);
}
}).join('');
const extra = (board.architecture === 'nrf52') ? renderNRF52EraseItem() : '';
accordion.insertAdjacentHTML('beforeend', renderAccordionItem(board, items + extra, idx === 0));
});
}
// ── Template renderers ──
function renderNRF52Item(hwModelSlug, version) {
return `
${hwModelSlug}-${version}
Download OTA
Download UF2
`;
}
function renderESP32Item(hwModelSlug, version) {
return `
${version}
`;
}
function renderNRF52EraseItem() {
return `
nrf_erase2.uf2
Download UF2
`;
}
function renderAccordionItem(board, bodyHtml, isOpen) {
return `
`;
}
// ── Modal logic ──
document.addEventListener('click', ev => {
if (!ev.target.matches('.open-modal-btn')) return;
const modalEl = document.getElementById('flashModal');
const flashModal = new bootstrap.Modal(modalEl);
const titleEl = document.getElementById('flashModalLabel');
const eraseChk = document.getElementById('eraseSwitch');
const logBox = document.getElementById('espLog');
let currentBoardSlug = ev.target.dataset.board;
selectedVersion = ev.target.dataset.version;
selectedBoard = boards.find(b => b.hwModelSlug === currentBoardSlug);
titleEl.textContent = `Flash – ${selectedBoard.displayName} ${selectedVersion}`;
eraseChk.checked = false;
logBox.textContent = '';
flashModal.show();
});
// ── Start Flash Button ──
const startBtn = document.getElementById('startFlashBtn');
startBtn.addEventListener('click', async () => {
const fullEraseInstall = document.getElementById('eraseSwitch').checked;
startBtn.disabled = true;
await flashFirmware(selectedBoard, selectedVersion, fullEraseInstall);
startBtn.disabled = false;
});