save/load custom names working

node_mode
Jake 2025-09-29 15:02:36 +08:00
parent e7e5e403c4
commit 5bd92fe30d
3 changed files with 46 additions and 12 deletions

View File

@ -45,7 +45,8 @@
<input type="range" id="frameSlider" min="0" max="399" value="0" style="width: 80%"> <input type="range" id="frameSlider" min="0" max="399" value="0" style="width: 80%">
</div> </div>
<label for="filenameInput">Filename:</label>
<input type="text" id="filenameInput" />
<button id="saveAnimation">Save Animation</button> <button id="saveAnimation">Save Animation</button>
<div id="fileListWrapper"> <div id="fileListWrapper">

View File

@ -72,6 +72,8 @@ window.onload = () => {
loadButton.disabled = true; loadButton.disabled = true;
deleteButton.disabled = true; deleteButton.disabled = true;
serial.requestFile(filename); serial.requestFile(filename);
}); });
@ -215,7 +217,17 @@ window.onload = () => {
//handleLoadedFile(fileData); //handleLoadedFile(fileData);
break; break;
case 0x06: // CMD_MESSAGE
console.log(`Message Recieved`);
const decoder = new TextDecoder();
console.log(payload);
const stringPayload = decoder.decode(new Uint8Array(payload));
console.log(stringPayload);
document.getElementById('log').value += "MSG: " + stringPayload + `\n`;
// 🔹 Do something with the file
//handleLoadedFile(fileData);
break;
// Add more cases as needed // Add more cases as needed
default: default:
document.getElementById('log').value += `Unknown command ${command}\n`; document.getElementById('log').value += `Unknown command ${command}\n`;
@ -312,9 +324,27 @@ window.onload = () => {
// 🔓 Unlock buttons // 🔓 Unlock buttons
loadButton.disabled = false; loadButton.disabled = false;
deleteButton.disabled = false; deleteButton.disabled = false;
document.getElementById("filenameInput").value = selectedFile.replace(/\.anim$/i, "");
}
function sanitizeFilename(input) {
// Remove non-alphanumeric characters
const stripped = input.replace(/[^a-zA-Z0-9]/g, "");
// If nothing remains, fallback to default
const safeName = stripped || "default";
// Add leading slash and .anim extension
return "/" + safeName + ".anim";
} }
async function sendAnimationToESP32() { async function sendAnimationToESP32() {
const rawInput = document.getElementById("filenameInput").value;
const filename = sanitizeFilename(rawInput);
console.log("Sanitized filename:", filename);
const frameCount = 500; const frameCount = 500;
const numChannels = 5; const numChannels = 5;
const frameRate = 50; const frameRate = 50;
@ -325,22 +355,25 @@ window.onload = () => {
const keyframeCount = dialKeyframes.reduce((sum, channel) => { const keyframeCount = dialKeyframes.reduce((sum, channel) => {
return sum + Object.keys(channel).length; return sum + Object.keys(channel).length;
}, 0); }, 0);
///const keyframeCount = dialKeyframes.length;
const keyframeDataSize = keyframeCount * 5; const keyframeDataSize = keyframeCount * 5;
for (var i = 0; i < 5; i++) {
console.log(dialKeyframes[i]);
}
console.log(dialKeyframes);
console.log(keyframeCount);
const totalSize = headerSize + 2 + keyframeDataSize; // 🔹 Filename encoding
console.log(totalSize); const filenameBytes = new TextEncoder().encode(filename);
const filenameLength = filenameBytes.length;
// Total packet size
const totalSize = 2 + filenameLength + headerSize + 2 + keyframeDataSize;
const buffer = new ArrayBuffer(totalSize); const buffer = new ArrayBuffer(totalSize);
const view = new DataView(buffer); const view = new DataView(buffer);
let offset = 0; let offset = 0;
// 🔹 Filename block
view.setUint16(offset, filenameLength, true); offset += 2;
filenameBytes.forEach(byte => view.setUint8(offset++, byte));
// 🔹 Header // 🔹 Header
view.setUint8(offset++, "A".charCodeAt(0)); view.setUint8(offset++, "A".charCodeAt(0));
view.setUint8(offset++, "N".charCodeAt(0)); view.setUint8(offset++, "N".charCodeAt(0));