animation save payload to esp32 now includes node graph, nodes, and connections
parent
83710c095e
commit
1c3bab83ec
|
|
@ -80,6 +80,55 @@ export class CurveEditor {
|
||||||
console.log(this.curveSets);
|
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) {
|
addChannel(motorID) {
|
||||||
this.setCurves([
|
this.setCurves([
|
||||||
{
|
{
|
||||||
|
|
@ -285,7 +334,7 @@ export class CurveEditor {
|
||||||
const currentTimeX = timeInFrames;
|
const currentTimeX = timeInFrames;
|
||||||
|
|
||||||
for (let curve of curves) {
|
for (let curve of curves) {
|
||||||
|
|
||||||
const p0 = this.transform(curve.startPoint);
|
const p0 = this.transform(curve.startPoint);
|
||||||
const h0 = this.transform(curve.startPointHandle);
|
const h0 = this.transform(curve.startPointHandle);
|
||||||
const h1 = this.transform(curve.endPointHandle);
|
const h1 = this.transform(curve.endPointHandle);
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,9 @@ export class NodeEditor {
|
||||||
|
|
||||||
view.setUint8(offset++, node.type); // Node type
|
view.setUint8(offset++, node.type); // Node type
|
||||||
view.setUint8(offset++, node.id); // Node ID
|
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) {
|
switch (node.type) {
|
||||||
case NODE_TYPES.Servo:
|
case NODE_TYPES.Servo:
|
||||||
|
|
|
||||||
63
script.js
63
script.js
|
|
@ -510,8 +510,8 @@ window.onload = () => {
|
||||||
const endHandleY = view.getInt16(offset, true); offset += 2;
|
const endHandleY = view.getInt16(offset, true); offset += 2;
|
||||||
const endPointY = view.getInt16(offset, true); offset += 2;
|
const endPointY = view.getInt16(offset, true); offset += 2;
|
||||||
|
|
||||||
console.log("RECEIVED VALUES RAW:");
|
//console.log("RECEIVED VALUES RAW:");
|
||||||
console.log(startTime, endTime, startPointY, endPointY);
|
//console.log(startTime, endTime, startPointY, endPointY);
|
||||||
|
|
||||||
const toFloat = v => (v / 65535) * 2 - 1;
|
const toFloat = v => (v / 65535) * 2 - 1;
|
||||||
|
|
||||||
|
|
@ -586,38 +586,11 @@ window.onload = () => {
|
||||||
const version = 1;
|
const version = 1;
|
||||||
|
|
||||||
const headerSize = 16;
|
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 filenameBytes = new TextEncoder().encode(filename);
|
||||||
const filenameLength = filenameBytes.length;
|
const filenameLength = filenameBytes.length;
|
||||||
|
|
||||||
const totalSize = 2 + filenameLength + headerSize + 2 + curveCount * segmentSize;
|
const totalSize = 1024;
|
||||||
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;
|
||||||
|
|
@ -636,28 +609,19 @@ window.onload = () => {
|
||||||
view.setUint8(offset++, frameRate);
|
view.setUint8(offset++, frameRate);
|
||||||
offset += 8; // reserved
|
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 => {
|
// 🔹 Append nodeGraphPacket
|
||||||
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 curvePacket
|
||||||
|
curvePacket.forEach(byte => view.setUint8(offset++, byte));
|
||||||
|
nodeGraphPacket.forEach(byte => view.setUint8(offset++, byte));
|
||||||
|
|
||||||
// 🔹 Send to ESP32
|
// 🔹 Send to ESP32
|
||||||
const payload = new Uint8Array(buffer);
|
const payload = new Uint8Array(buffer.slice(0, offset));
|
||||||
console.log()
|
console.log()
|
||||||
console.log(payload);
|
console.log(payload);
|
||||||
serial.saveFile(payload); // CMD_SAVE_ANIMATION
|
serial.saveFile(payload); // CMD_SAVE_ANIMATION
|
||||||
|
|
@ -711,8 +675,9 @@ window.onload = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
document.getElementById('sendNodes').onclick = async () => {
|
document.getElementById('sendNodes').onclick = async () => {
|
||||||
console.log(nodeEditor.encodeNodeGraph());
|
nodeGraphPacket = nodeEditor.encodeNodeGraph();
|
||||||
|
curvePacket = curveEditor.encodeCurves()
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue