animation.ino 2.2 KB

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