diff --git a/curveEditor.js b/curveEditor.js index 1de893d..4118042 100644 --- a/curveEditor.js +++ b/curveEditor.js @@ -80,6 +80,55 @@ export class CurveEditor { console.log(this.curveSets); } + encodeCurves() { + const bufferSize = 1024; // adjust based on expected graph size + const buffer = new ArrayBuffer(bufferSize); + const view = new DataView(buffer); + let offset = 0; + + const curveSegments = []; + Object.entries(this.curveSets).forEach(([motorIDStr, segments]) => { + const motorID = parseInt(motorIDStr, 10); + segments.forEach(segment => { + + curveSegments.push({ + motorID, + startTime: segment.startPoint.x, + endTime: segment.endPoint.x, + startPointY: segment.startPoint.y, + startHandleX: segment.startPointHandle.x, + startHandleY: segment.startPointHandle.y, + endHandleX: segment.endPointHandle.x, + endHandleY: segment.endPointHandle.y, + endPointY: segment.endPoint.y + }); + }); + }); + console.log(curveSegments); + const curveCount = curveSegments.length; + view.setUint16(offset, curveCount, true); offset += 2; + + // ๐Ÿ”น Curve segments + + curveSegments.forEach(seg => { + console.log(offset, seg.motorID); + view.setUint8(offset++, seg.motorID); + view.setUint16(offset, seg.startTime, true); offset += 2; + view.setUint16(offset, seg.endTime, true); offset += 2; + view.setInt16(offset, this.yToExportRange(seg.startPointY), true); offset += 2; + view.setUint16(offset, seg.startHandleX, true); offset += 2; + view.setInt16(offset, this.yToExportRange(seg.startHandleY), true); offset += 2; + view.setUint16(offset, seg.endHandleX, true); offset += 2; + view.setInt16(offset, this.yToExportRange(seg.endHandleY), true); offset += 2; + view.setInt16(offset, this.yToExportRange(seg.endPointY), true); offset += 2; + }); + console.log("๐Ÿงต Curve segments packed:", curveSegments.length); + console.log(curveSegments); + + + return new Uint8Array(buffer.slice(0, offset)); + } + addChannel(motorID) { this.setCurves([ { @@ -285,7 +334,7 @@ export class CurveEditor { const currentTimeX = timeInFrames; for (let curve of curves) { - + const p0 = this.transform(curve.startPoint); const h0 = this.transform(curve.startPointHandle); const h1 = this.transform(curve.endPointHandle); diff --git a/nodeeditor/NodeEditor.js b/nodeeditor/NodeEditor.js index 991dc94..c056c4b 100644 --- a/nodeeditor/NodeEditor.js +++ b/nodeeditor/NodeEditor.js @@ -57,6 +57,9 @@ export class NodeEditor { view.setUint8(offset++, node.type); // Node type view.setUint8(offset++, node.id); // Node ID + view.setUint16(offset, node.x, true); offset+=2; + view.setUint16(offset, node.y, true); offset+=2; + switch (node.type) { case NODE_TYPES.Servo: diff --git a/script.js b/script.js index b382626..318c3ce 100644 --- a/script.js +++ b/script.js @@ -510,8 +510,8 @@ window.onload = () => { const endHandleY = view.getInt16(offset, true); offset += 2; const endPointY = view.getInt16(offset, true); offset += 2; - console.log("RECEIVED VALUES RAW:"); - console.log(startTime, endTime, startPointY, endPointY); + //console.log("RECEIVED VALUES RAW:"); + //console.log(startTime, endTime, startPointY, endPointY); const toFloat = v => (v / 65535) * 2 - 1; @@ -586,38 +586,11 @@ window.onload = () => { const version = 1; const headerSize = 16; - const curveSegments = []; - // ๐Ÿ”น Collect all curve segments - Object.entries(curveEditor.curveSets).forEach(([motorIDStr, segments]) => { - const motorID = parseInt(motorIDStr, 10); - segments.forEach(segment => { - const toTime = x => Math.max(0, Math.round(curveEditor.xToValue(x) * 100)); // seconds โ†’ centiseconds - const toUint16 = v => { - const normalized = Math.max(-1, Math.min(1, v)); // clamp to [-1, 1] - return Math.round((normalized + 1) / 2 * 65535); - }; - - curveSegments.push({ - motorID, - startTime: segment.startPoint.x, - endTime: segment.endPoint.x, - startPointY: segment.startPoint.y, - startHandleX: segment.startPointHandle.x, - startHandleY: segment.startPointHandle.y, - endHandleX: segment.endPointHandle.x, - endHandleY: segment.endPointHandle.y, - endPointY: segment.endPoint.y - }); - }); - }); - - const curveCount = curveSegments.length; - const segmentSize = 17; const filenameBytes = new TextEncoder().encode(filename); const filenameLength = filenameBytes.length; - const totalSize = 2 + filenameLength + headerSize + 2 + curveCount * segmentSize; + const totalSize = 1024; const buffer = new ArrayBuffer(totalSize); const view = new DataView(buffer); let offset = 0; @@ -636,28 +609,19 @@ window.onload = () => { view.setUint8(offset++, frameRate); offset += 8; // reserved - // ๐Ÿ”น Curve count - view.setUint16(offset, curveCount, true); offset += 2; - // ๐Ÿ”น Curve segments + let curvePacket = curveEditor.encodeCurves() + let nodeGraphPacket = nodeEditor.encodeNodeGraph(); - curveSegments.forEach(seg => { - view.setUint8(offset++, seg.motorID); - view.setUint16(offset, seg.startTime, true); offset += 2; - view.setUint16(offset, seg.endTime, true); offset += 2; - view.setInt16(offset, curveEditor.yToExportRange(seg.startPointY), true); offset += 2; - view.setUint16(offset, seg.startHandleX, true); offset += 2; - view.setInt16(offset, curveEditor.yToExportRange(seg.startHandleY), true); offset += 2; - view.setUint16(offset, seg.endHandleX, true); offset += 2; - view.setInt16(offset, curveEditor.yToExportRange(seg.endHandleY), true); offset += 2; - view.setInt16(offset, curveEditor.yToExportRange(seg.endPointY), true); offset += 2; - }); - console.log("๐Ÿงต Curve segments packed:", curveSegments.length); - console.log(curveSegments); + // ๐Ÿ”น Append nodeGraphPacket + + // ๐Ÿ”น Append curvePacket + curvePacket.forEach(byte => view.setUint8(offset++, byte)); + nodeGraphPacket.forEach(byte => view.setUint8(offset++, byte)); // ๐Ÿ”น Send to ESP32 - const payload = new Uint8Array(buffer); + const payload = new Uint8Array(buffer.slice(0, offset)); console.log() console.log(payload); serial.saveFile(payload); // CMD_SAVE_ANIMATION @@ -711,8 +675,9 @@ window.onload = () => { }; document.getElementById('sendNodes').onclick = async () => { - console.log(nodeEditor.encodeNodeGraph()); - + nodeGraphPacket = nodeEditor.encodeNodeGraph(); + curvePacket = curveEditor.encodeCurves() + };