Skip to content

Digits7SAnimator

Денис Чухліб edited this page Jul 20, 2023 · 4 revisions

Digits7SAnimator

Клас на основі 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);

Clone this wiki locally