mirror of
https://github.com/PaulStoffregen/Tlc5940
synced 2025-06-26 18:07:46 +02:00
89 lines
3.3 KiB
C
89 lines
3.3 KiB
C
/* Copyright (c) 2009 by Alex Leone <acleone ~AT~ gmail.com>
|
|
|
|
This file is part of the Arduino TLC5940 Library.
|
|
|
|
The Arduino TLC5940 Library is free software: you can redistribute it
|
|
and/or modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation, either version 3 of the
|
|
License, or (at your option) any later version.
|
|
|
|
The Arduino TLC5940 Library is distributed in the hope that it will be
|
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with The Arduino TLC5940 Library. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef TLC_ANIMATIONS_H
|
|
#define TLC_ANIMATIONS_H
|
|
|
|
/** \file
|
|
TLC Animation functions. These play animations from PROGMEM. */
|
|
|
|
#include <avr/pgmspace.h>
|
|
#include <avr/io.h>
|
|
|
|
#include "tlc_config.h"
|
|
#include "Tlc5940.h"
|
|
#include "tlc_progmem_utils.h"
|
|
|
|
/** The currently playing animation */
|
|
const uint8_t *tlc_currentAnimation;
|
|
/** The number of frames in the current animation */
|
|
volatile uint16_t tlc_animationFrames;
|
|
/** The number of PWM periods to display each frame - 1 */
|
|
volatile uint16_t tlc_animationPeriodsPerFrame;
|
|
/** The current number of periods we've displayed this frame for */
|
|
volatile uint16_t tlc_animationPeriodsWait;
|
|
|
|
volatile void tlc_animationXLATCallback(void);
|
|
void tlc_playAnimation(const uint8_t /* PROGMEM */ *animation, uint16_t frames, uint16_t periodsPerFrame);
|
|
|
|
/** \addtogroup ExtendedFunctions
|
|
\code #include "tlc_animations.h" \endcode
|
|
- void tlc_playAnimation(const uint8_t PROGMEM *animation, uint16_t frames,
|
|
uint16_t periodsPerFrame) - plays an animation from progmem. */
|
|
/* @{ */
|
|
|
|
/** Plays an animation from progmem in the "background" (with interrupts).
|
|
\param animation A progmem array of grayscale data, length NUM_TLCS *
|
|
24 * frames, in reverse order. Ensure that there is not an update
|
|
waiting to happen before calling this.
|
|
\param frames the number of frames in animation
|
|
\param periodsPerFrame number of PWM periods to wait between each frame
|
|
(0 means play the animation as fast as possible).
|
|
The default PWM period for a 16MHz clock is 1.024ms. */
|
|
void tlc_playAnimation(const uint8_t /* PROGMEM */ *animation, uint16_t frames, uint16_t periodsPerFrame)
|
|
{
|
|
tlc_currentAnimation = animation;
|
|
tlc_animationFrames = frames;
|
|
tlc_animationPeriodsPerFrame = periodsPerFrame;
|
|
tlc_animationPeriodsWait = 0;
|
|
tlc_onUpdateFinished = tlc_animationXLATCallback;
|
|
tlc_animationXLATCallback();
|
|
}
|
|
|
|
/** This is called by the XLAT interrupt every PWM period to do stuff. */
|
|
volatile void tlc_animationXLATCallback(void)
|
|
{
|
|
if (tlc_animationPeriodsWait) {
|
|
tlc_animationPeriodsWait--;
|
|
set_XLAT_interrupt();
|
|
} else {
|
|
if (tlc_animationFrames) {
|
|
tlc_setGSfromProgmem(tlc_currentAnimation +
|
|
(--tlc_animationFrames * NUM_TLCS * 24));
|
|
tlc_animationPeriodsWait = tlc_animationPeriodsPerFrame;
|
|
Tlc.update();
|
|
} else { // animation is done
|
|
tlc_onUpdateFinished = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* @} */
|
|
|
|
#endif
|