/** * Handles Binary Data Ingestion via Fetch. */ (function (global) { global.DataLoader = { /** * Fetches and parses the binary simulation data. * @param {string} url - URL to the binary file. * @returns {Promise} - { labels, data } or error. */ async loadBinary(url = 'simulation.bin') { try { const response = await fetch(url, { cache: "no-store" }); if (!response.ok) throw new Error(`HTTP Error: ${response.status}`); const buffer = await response.arrayBuffer(); return this.parseBuffer(buffer); } catch (err) { console.error("Load Failed:", err); throw err; } }, parseBuffer(buffer) { const dataView = new DataView(buffer); let offset = 0; // 1. Read Header const magic = dataView.getUint32(offset, true); // Little Endian offset += 4; const count = dataView.getUint32(offset, true); offset += 4; if (magic !== 0xFEAA01) { throw new Error(`Invalid Magic Number: 0x${magic.toString(16)}`); } // 2. Read X Data const xData = []; for (let i = 0; i < count; i++) { xData.push(dataView.getFloat32(offset, true)); offset += 4; } // 3. Read Y Data const yData = []; for (let i = 0; i < count; i++) { yData.push(dataView.getFloat32(offset, true)); offset += 4; } // Format for Plotter (Labels as strings/numbers, Data as numbers) // Plotter expects labels, but for scatter/line with x,y numbers we might adjust plotter. // For now, mapping X to labels is fine for simple line plots. return { labels: xData.map(x => x.toFixed(2)), data: yData }; } }; })(window);