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 `

      ${bodyHtml}
    `; } // ── 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; });