animation.ino 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /* Animation Rendering Logics */
  2. int frameCount = 0;
  3. char previousAnicode = 'a';
  4. //delay with early breakout if current animation code changed
  5. void delayWithEarlyBreakout(int delayDuration) {
  6. delayDuration = delayDuration / 100;
  7. for (int i = 0; i < delayDuration; i++) {
  8. delay(100);
  9. if (getAnimationCode() != previousAnicode) {
  10. break;
  11. }
  12. }
  13. }
  14. //Handle animation rendering
  15. void handleAnimationRendering(char anicode) {
  16. if (previousAnicode != anicode) {
  17. previousAnicode = anicode;
  18. frameCount = 0;
  19. }
  20. //Check if the target animation frame is static
  21. String targetFrame = "/" + String(anicode) + ".bin";
  22. if (SD.exists(targetFrame)) {
  23. //This is a static frame. Load and render it
  24. loadFrameAndRender(targetFrame);
  25. int delayDuration = getFrameDuration(anicode, 0);
  26. delayWithEarlyBreakout(delayDuration);
  27. return;
  28. }
  29. //It is not a static frame. Check if x0.bin exists
  30. targetFrame = "/" + String(anicode) + String(frameCount) + ".bin";
  31. if (SD.exists(targetFrame)) {
  32. loadFrameAndRender(targetFrame);
  33. frameCount++;
  34. int delayDuration = getFrameDuration(anicode, frameCount);
  35. delayWithEarlyBreakout(delayDuration);
  36. return;
  37. } else {
  38. //Not found.
  39. if (frameCount != 0) {
  40. loadFrameAndRender("/" + String(anicode) + "0.bin");
  41. int delayDuration = getFrameDuration(anicode, 0);
  42. delayWithEarlyBreakout(delayDuration);
  43. frameCount = 1;
  44. return;
  45. } else {
  46. //frameCount = 0. x0.bin not exists. Report error
  47. Serial.println("Target frame buffer not found: " + String(anicode) + ".bin");
  48. setAnimationCode('a');
  49. return;
  50. }
  51. }
  52. }
  53. //Get how long the frame shd last.
  54. //Default 500 unless specially programmed
  55. int getFrameDuration(char anicode, int framecount) {
  56. if ((anicode == 'a' || anicode == 'b' || anicode == 'g')) {
  57. //Blinking
  58. if (framecount == 0) {
  59. return 3000;
  60. }
  61. return 300;
  62. }
  63. return 500;
  64. }