From 069f0c405c9c7278a84c13b5596ee527ab7ba319 Mon Sep 17 00:00:00 2001 From: Jake Date: Sun, 28 Sep 2025 22:05:41 +0800 Subject: [PATCH] switching to faster comms --- HansonServo.ino | 104 +++++++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 46 deletions(-) diff --git a/HansonServo.ino b/HansonServo.ino index d156ed5..6164cbf 100644 --- a/HansonServo.ino +++ b/HansonServo.ino @@ -15,6 +15,7 @@ #define CMD_DELETE_FILE 0x04 #define CMD_LOAD_FILE_CHUNK 0x05 + #define MAX_ANIMATION_SIZE (16 + MAX_FRAMES * NUM_CHANNELS * 2 + 512) // generous buffer uint8_t animationBuffer[MAX_ANIMATION_SIZE]; size_t receivedSize = 0; @@ -132,50 +133,8 @@ void loop() { } } -void HandleSerialRequests() { - if (Serial.available() >= 4) { - if (Serial.read() == HEADER1 && Serial.read() == HEADER2) { - uint8_t command = Serial.read(); - uint8_t length = Serial.read(); - String payload = ""; - for (int i = 0; i < length; i++) { - while (!Serial.available()) - ; - payload += (char)Serial.read(); - } - handleCommand(command, payload, length); - } - } -} - -void handleCommand(uint8_t command, const String& payload, uint8_t length) { - switch (command) { - case CMD_ID_REQUEST: - sendIdPacket(); - break; - - case CMD_FILE_LIST: - sendFileList(); - break; - - case CMD_LOAD_FILE: - sendFileContent(payload); - break; - - case CMD_DELETE_FILE: - deleteFile(payload); - break; - - case CMD_LOAD_FILE_CHUNK: - handleAnimationChunk(payload, length); - break; - - // default: - // Serial.println("{\"error\":\"Unknown command\"}"); - } -} void sendOkResponse(uint8_t command, const char* note = "chunk received") { String payload = String("{\"status\":\"ok\",\"note\":\"") + note + "\"}"; @@ -195,15 +154,66 @@ void sendOkResponse(uint8_t command, const char* note = "chunk received") { Serial.write(checksum); } +void HandleSerialRequests() { + if (Serial.available() >= 5) { + if (Serial.read() == HEADER1 && Serial.read() == HEADER2) { + uint8_t command = Serial.read(); + uint8_t lengthHigh = Serial.read(); + uint8_t lengthLow = Serial.read(); + uint16_t payloadLength = (lengthHigh << 8) | lengthLow; -void handleAnimationChunk(const String& payload, uint8_t length) { + while (Serial.available() < payloadLength) + ; + + uint8_t payload[payloadLength]; + for (int i = 0; i < payloadLength; i++) { + payload[i] = Serial.read(); + } + + sendOkResponse(CMD_LOAD_FILE_CHUNK, String(command).c_str()); + handleCommand(command, payload, payloadLength); + } + } +} + + + +void handleCommand(uint8_t command, const uint8_t* payload, uint16_t length) { + sendOkResponse(CMD_LOAD_FILE_CHUNK, String(command).c_str()); + switch (command) { + case CMD_ID_REQUEST: + sendIdPacket(); + break; + + case CMD_FILE_LIST: + sendFileList(); + break; + + case CMD_LOAD_FILE: { + String fileName = String((const char*)payload, length); + sendFileContent(fileName); + break; + } + + case CMD_DELETE_FILE: { + String fileName = String((const char*)payload, length); + deleteFile(fileName); + break; + } + + case CMD_LOAD_FILE_CHUNK: + handleAnimationChunk(payload, length); + break; + } +} + + +void handleAnimationChunk(const uint8_t* data, uint16_t length) { if (length < 4) { sendOkResponse(CMD_LOAD_FILE_CHUNK, "fail: too short"); return; } - const uint8_t* data = (const uint8_t*)payload.c_str(); - uint16_t offset = (data[0] << 8) | data[1]; uint16_t totalSize = (data[2] << 8) | data[3]; const uint8_t* chunk = &data[4]; @@ -231,7 +241,8 @@ void handleAnimationChunk(const String& payload, uint8_t length) { currentAnimation.saveToFile("savey.anim"); sendOkResponse(CMD_LOAD_FILE_CHUNK, "final chunk"); } else { - sendOkResponse(CMD_LOAD_FILE_CHUNK, "chunk received"); + String note = "receivedSize=" + String(receivedSize); + sendOkResponse(CMD_LOAD_FILE_CHUNK, note.c_str()); } } @@ -239,6 +250,7 @@ void handleAnimationChunk(const String& payload, uint8_t length) { + void loadAnimationFromBuffer(const uint8_t* buffer, size_t length) { currentAnimation.clear();