-
Notifications
You must be signed in to change notification settings - Fork 0
Digits7SAnimator
Денис Чухліб edited this page Jul 20, 2023
·
4 revisions
Клас на основі Digits7S для обробки анімацій як посегментно так і для всих одночасно
template <uint16_t DigitsSize = 4> // DigitsSize - кількість сегментів
class Digits7SAnimator : public Digits7S<DigitsSize> //(Складається з Digits7S)
// Використовувати так - Digits7SAnimator<DigitsSize> data;
public:
Digits7SAnimator(); // Пустий конструктор
void setDel(uint16_t pos, uint16_t delay); // Встановлення затримки 1 кадру за позицією pos
void setAllDel(uint16_t delay); // Всновлення затримки 1 кадру на всі позиції
uint16_t getDel(uint16_t pos); // Отримати затримку за позицією pos
bool tickAnimation(); // Асинхронна функція яка обробляє анімації
bool isAnimation(); // Чи є якась анімація
bool isAnimation(uint16_t pos); // Чи є анімація в позиції pos
// Функція запуску анімації зі вказаним id на всих сегментах
void startAllAnimation(uint8_t id, const Digits7SArray<DigitsSize>& nData, bool resetData, bool stopAnimation);
// Функція запуску анімації зі вказаним id в позиції pos
void startAnimation(uint8_t id, uint16_t pos, const Digit7SData& nData, bool resetData, bool stopAnimation);
// Зупинити анімацію в позиції pos (Встановиться останній кадр)
void stopAnimation(uint16_t pos);
// Зупинити анімації у всих сегментах (Встановиться останній кадр)
void stopAllAnimation();
// Дізнатися id анімації (id всих анімацій в enum нижче)
uint8_t getAnimationId(uint16_t pos); // В позиції pos
uint8_t getAnimationId(); // Якщо у всих однакова анімація то поверне її id, якщо ні то DIFFERENT_MODS
uint16_t getFrame(uint16_t pos); // Дізнатиця номер кадра анімації в позиції pos
bool nextFrame(uint16_t pos); // Перейти до наступного кадра в позиції pos
static uint16_t getAnimationFrames(uint8_t id) { // Дізнатися кількість кадрів анімації
switch (id) {
case NONE: return 0;
case SCROLL: return 6;
case SCROLL_UP: return 6;
case TWIST: return 26;
}
return 0;
}
enum { // ID анімацій
NONE,
SCROLL,
SCROLL_UP,
TWIST,
DIFFERENT_MODS = 255
};
// resetData - Запустити анімацію навіть якщо дані однакові
// stopAnimation - Запустити анімацію навіть якщо вже запущена анімація
//=============================================================================================
// animation pos (Анімації в позиції pos)
void scroll (uint16_t pos, const Digit7SData& nData, bool resetData = false, bool stopAnimation = false) {
startAnimation(SCROLL, pos, nData, resetData, stopAnimation);
}
void scrollUp(uint16_t pos, const Digit7SData& nData, bool resetData = false, bool stopAnimation = false) {
startAnimation(SCROLL_UP, pos, nData, resetData, stopAnimation);
}
void twist (uint16_t pos, const Digit7SData& nData, bool resetData = false, bool stopAnimation = false) {
startAnimation(TWIST, pos, nData, resetData, stopAnimation);
}
//=============================================================================================
// animation all (Анімації для всих сегментів)
void scroll (const Digits7SArray<DigitsSize>& nData, bool resetData = false, bool stopAnimation = false) {
startAllAnimation(SCROLL, nData, resetData, stopAnimation);
}
void scrollUp(const Digits7SArray<DigitsSize>& nData, bool resetData = false, bool stopAnimation = false) {
startAllAnimation(SCROLL_UP, nData, resetData, stopAnimation);
}
void twist (const Digits7SArray<DigitsSize>& nData, bool resetData = false, bool stopAnimation = false) {
startAllAnimation(TWIST, nData, resetData, stopAnimation);
}
//=============================================================================================
// animation all int (Анімації встановлення числа для всих сегментів)
void scrollInt (int64_t n, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
scroll(data.setInt(n), resetData, stopAnimation);
}
void scrollUpInt(int64_t n, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
scrollUp(data.setInt(n), resetData, stopAnimation);
}
void twistInt (int64_t n, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
twist(data.setInt(n), resetData, stopAnimation);
}
//=============================================================================================
// animation all clock 4-dig (Анімації встановлення часу для 4-х сегментів)
void scrollClock (uint8_t h, uint8_t m, bool noFirstZero = 1, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
scroll(data.setClock(h, m, noFirstZero), resetData, stopAnimation);
}
void scrollUpClock (uint8_t h, uint8_t m, bool noFirstZero = 1, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
scrollUp(data.setClock(h, m, noFirstZero), resetData, stopAnimation);
}
void twistClock (uint8_t h, uint8_t m, bool noFirstZero = 1, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
twist(data.setClock(h, m, noFirstZero), resetData, stopAnimation);
}
//=============================================================================================
// animation all clock 6-dig (Анімації встановлення часу для 6 сегментів)
void scrollClock (uint8_t h, uint8_t m, uint8_t s, bool noFirstZero = 1, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
scroll(data.setClock(h, m, s, noFirstZero), resetData, stopAnimation);
}
void scrollUpClock (uint8_t h, uint8_t m, uint8_t s, bool noFirstZero = 1, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
scrollUp(data.setClock(h, m, s, noFirstZero), resetData, stopAnimation);
}
void twistClock (uint8_t h, uint8_t m, uint8_t s, bool noFirstZero = 1, bool resetData = false, bool stopAnimation = false) {
Digits7S<DigitsSize> data;
twist(data.setClock(h, m, s, noFirstZero), resetData, stopAnimation);
}
protected: // Захищені дані і функції для покращення та додавання анімацій іншими класами
uint16_t del[DigitsSize]; // Масив затримок
uint32_t timer[DigitsSize]; // Масив таймерів
uint16_t frame[DigitsSize]; // Масив поточних номерів кадрів
uint8_t animationId[DigitsSize]; // Масив id
// Захищене поле з масивом сегментів з класу Digits7S
Digits7SArray<DigitsSize> digits;
// Масив нових данних для анімації сегментів
Digits7SArray<DigitsSize> newDigits;
// Функція яка запускає функції конкретних анімації за id (Її потрібно перевизначати для додавання нових анімацій)
// І беріть нові ID починаючи з 250 і нижче тому що з новими оновленнями нові анімації будуть з ID від останньої анімації і вище
virtual void showFrame(uint16_t pos);
// Функція обробки кадрів SCROLL
void scrollFrame(uint16_t pos);
// Функція обробки кадрів SCROLL_UP
void scrollUpFrame(uint16_t pos);
// Функція обробки кадрів TWIST
void twistFrame(uint16_t pos);