tweaks to FRME packets

protocolv2
Jake 2026-01-19 00:09:26 +08:00
parent 2a1b4bd276
commit ca2fb29a02
1 changed files with 15 additions and 5 deletions

View File

@ -175,35 +175,45 @@ void runFrameAnimation() {
currentTick++; currentTick++;
// Handle animation end // Handle animation end
uint16_t framesPlayed = currentTick - animState.startFrame;
uint16_t totalFrames = animState.current->getFrameCount(); uint16_t totalFrames = animState.current->getFrameCount();
uint16_t framesPlayed = currentTick - animState.startFrame;
uint16_t remainingFrames = (totalFrames > animState.startFrame) ? (totalFrames - animState.startFrame) : 0; uint16_t remainingFrames = (totalFrames > animState.startFrame) ? (totalFrames - animState.startFrame) : 0;
// Debug: log completion check near the end
if (remainingFrames > 0 && framesPlayed >= remainingFrames - 1) {
sendMessage("Completion check - currentTick: " + String(currentTick) + ", framesPlayed: " + String(framesPlayed) + ", remainingFrames: " + String(remainingFrames) + ", totalFrames: " + String(totalFrames));
}
// Check if we've played all remaining frames (from startFrame to totalFrames-1)
if (totalFrames > 0 && remainingFrames > 0 && framesPlayed >= remainingFrames) { if (totalFrames > 0 && remainingFrames > 0 && framesPlayed >= remainingFrames) {
sendMessage("Animation completion triggered! Sending completion packet.");
switch (animState.playMode) { switch (animState.playMode) {
case PLAY_ONCE: case PLAY_ONCE:
animState.stop();
{ {
// Send completion packet BEFORE stopping animation
uint8_t done[4]; uint8_t done[4];
done[0] = currentTick & 0xFF; done[0] = currentTick & 0xFF;
done[1] = (currentTick >> 8) & 0xFF; done[1] = (currentTick >> 8) & 0xFF;
done[2] = static_cast<uint8_t>(animState.playMode); done[2] = static_cast<uint8_t>(animState.playMode);
done[3] = 1; // complete done[3] = 1; // complete
//sendPacket(Tag::FRAME, done, 4); sendPacket(Tag::FRAME, done, 4);
animState.stop();
} }
break; break;
case PLAY_LOOP: case PLAY_LOOP:
// Reset to start frame for seamless looping
currentTick = animState.startFrame; currentTick = animState.startFrame;
break; break;
case PLAY_REPEAT: case PLAY_REPEAT:
if (--animState.repeatsRemaining == 0) { if (--animState.repeatsRemaining == 0) {
animState.stop(); // Send completion packet BEFORE stopping animation
uint8_t done[4]; uint8_t done[4];
done[0] = currentTick & 0xFF; done[0] = currentTick & 0xFF;
done[1] = (currentTick >> 8) & 0xFF; done[1] = (currentTick >> 8) & 0xFF;
done[2] = static_cast<uint8_t>(animState.playMode); done[2] = static_cast<uint8_t>(animState.playMode);
done[3] = 1; // complete done[3] = 1; // complete
//sendPacket(Tag::FRAME, done, 4); sendPacket(Tag::FRAME, done, 4);
animState.stop();
} else { } else {
currentTick = animState.startFrame; currentTick = animState.startFrame;
} }