|
@@ -62,6 +62,9 @@ static const char PARAMS_HTML[] PROGMEM = R"HTML(
|
|
|
<button class="btn btn-outline-secondary btn-sm" onclick="readAll()">
|
|
<button class="btn btn-outline-secondary btn-sm" onclick="readAll()">
|
|
|
<i class="fa fa-refresh"></i> Read All
|
|
<i class="fa fa-refresh"></i> Read All
|
|
|
</button>
|
|
</button>
|
|
|
|
|
+ <button class="btn btn-outline-secondary btn-sm" onclick="generateHeader()">
|
|
|
|
|
+ <i class="fa fa-file-code-o"></i> Export .h File
|
|
|
|
|
+ </button>
|
|
|
<button class="btn btn-outline-danger btn-sm" onclick="clearRows()">
|
|
<button class="btn btn-outline-danger btn-sm" onclick="clearRows()">
|
|
|
<i class="fa fa-trash"></i> Clear All
|
|
<i class="fa fa-trash"></i> Clear All
|
|
|
</button>
|
|
</button>
|
|
@@ -264,6 +267,88 @@ function saveState() {
|
|
|
try { localStorage.setItem('modulos_dsp_params', JSON.stringify(rows)); } catch(e) {}
|
|
try { localStorage.setItem('modulos_dsp_params', JSON.stringify(rows)); } catch(e) {}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function toDefine(label, addr) {
|
|
|
|
|
+ var s = label.trim().toUpperCase();
|
|
|
|
|
+ s = s.replace(/[^A-Z0-9]+/g, '_'); // non-alphanumeric runs → underscore
|
|
|
|
|
+ s = s.replace(/^_+|_+$/g, ''); // trim leading/trailing underscores
|
|
|
|
|
+ if (!s || /^[0-9]/.test(s)) {
|
|
|
|
|
+ // empty or starts with digit — fall back to address
|
|
|
|
|
+ return 'PARAM_0x' + ('000' + addr.toString(16).toUpperCase()).slice(-4);
|
|
|
|
|
+ }
|
|
|
|
|
+ return 'PARAM_' + s;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function generateHeader() {
|
|
|
|
|
+ var rows = document.getElementById('paramRows').children;
|
|
|
|
|
+ if (rows.length === 0) {
|
|
|
|
|
+ alert('No parameters to export. Add some parameters first.');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Collect valid rows
|
|
|
|
|
+ var defines = [];
|
|
|
|
|
+ var seen = {};
|
|
|
|
|
+ for (var i = 0; i < rows.length; i++) {
|
|
|
|
|
+ var id = parseInt(rows[i].id.replace('row-', ''));
|
|
|
|
|
+ var addr = getAddr(id);
|
|
|
|
|
+ if (addr === null) continue;
|
|
|
|
|
+ var label = document.getElementById('lbl-' + id).value;
|
|
|
|
|
+ var name = toDefine(label, addr);
|
|
|
|
|
+ // Deduplicate: second occurrence becomes NAME_2, third NAME_3, etc.
|
|
|
|
|
+ if (seen[name]) {
|
|
|
|
|
+ seen[name]++;
|
|
|
|
|
+ name = name + '_' + seen[name];
|
|
|
|
|
+ } else {
|
|
|
|
|
+ seen[name] = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ defines.push({
|
|
|
|
|
+ name: name,
|
|
|
|
|
+ addr: '0x' + ('000' + addr.toString(16).toUpperCase()).slice(-4),
|
|
|
|
|
+ label: label.trim()
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (defines.length === 0) {
|
|
|
|
|
+ alert('No valid addresses found. Check address fields contain 0x0000–0x03FF.');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Align #define values to longest name
|
|
|
|
|
+ var maxLen = 0;
|
|
|
|
|
+ defines.forEach(function(d) { if (d.name.length > maxLen) maxLen = d.name.length; });
|
|
|
|
|
+
|
|
|
|
|
+ var now = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
|
|
|
+ var host = window.location.hostname;
|
|
|
|
|
+ var lines = [
|
|
|
|
|
+ '// ModulosDSP — DSP Parameter Addresses',
|
|
|
|
|
+ '// Generated: ' + now,
|
|
|
|
|
+ '// Device: ' + host,
|
|
|
|
|
+ '//',
|
|
|
|
|
+ '// Use with DSPWriter::safeload_writeRegister(PARAM_NAME, value, true);',
|
|
|
|
|
+ '//',
|
|
|
|
|
+ '#pragma once',
|
|
|
|
|
+ '',
|
|
|
|
|
+ '// Parameter RAM (ADAU1401/1701 — 5.23 fixed-point, 4 bytes/word, 0x0000–0x03FF)'
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ defines.forEach(function(d) {
|
|
|
|
|
+ var pad = new Array(maxLen - d.name.length + 3).join(' ');
|
|
|
|
|
+ var comment = d.label ? (' // ' + d.label) : '';
|
|
|
|
|
+ lines.push('#define ' + d.name + pad + d.addr + comment);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ var content = lines.join('\n') + '\n';
|
|
|
|
|
+ var blob = new Blob([content], { type: 'text/plain' });
|
|
|
|
|
+ var url = URL.createObjectURL(blob);
|
|
|
|
|
+ var a = document.createElement('a');
|
|
|
|
|
+ a.href = url;
|
|
|
|
|
+ a.download = 'dsp_params.h';
|
|
|
|
|
+ document.body.appendChild(a);
|
|
|
|
|
+ a.click();
|
|
|
|
|
+ document.body.removeChild(a);
|
|
|
|
|
+ URL.revokeObjectURL(url);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function loadState() {
|
|
function loadState() {
|
|
|
try {
|
|
try {
|
|
|
var s = localStorage.getItem('modulos_dsp_params');
|
|
var s = localStorage.getItem('modulos_dsp_params');
|