* @file easing.h
* @author uYanki (https://github.com/uYanki)
* @brief https://github.com/uYanki/board-stm32f103rc-berial/blob/main/7.Example/HAL/19.GUI/03%20u8g2/02%20menu/Lib/easing/easing.h
* @version 0.1
* @date 2023-01-15
*
* @copyright Copyright (c) 2023
*
*/
#ifndef __EASING_H__
#define __EASING_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <math.h>
#include <stdbool.h>
#include <stdint.h>
typedef float (*easing_calc_t)(const float t);
typedef uint32_t (*easing_tick_cb_t)(void);
typedef float easing_pos_t;
typedef enum {
EASING_MODE_BITCNT = 4,
EASING_MODE_MASK = (1 << EASING_MODE_BITCNT) - 1,
EASING_TIMES_SINGLE = 0 << 0,
EASING_TIMES_MANYTIMES = 1 << 0,
EASING_TIMES_INFINITE = 1 << 1,
EASING_TIMES_SET = EASING_MODE_BITCNT,
EASING_DIR_FORWARD = 0 << 0,
EASING_DIR_REVERSE = 1 << 2,
EASING_DIR_BACKANDFORTH = 1 << 3,
} easing_mode_t;
#define EASING_MODE_DEFAULT ((easing_mode_t)(EASING_TIMES_SINGLE | EASING_DIR_FORWARD))
#define EASING_MODE_NTIMES(n) EASING_TIMES_MANYTIMES | (n << EASING_TIMES_SET)
#define EASING_INTERVAL_NONE 0
typedef struct easing {
easing_mode_t dwMode;
easing_calc_t lpfnCalc;
easing_pos_t nStart;
easing_pos_t nStop;
easing_pos_t nOffset;
easing_pos_t nDelta;
easing_pos_t nCurrent;
uint16_t nFrameCount;
uint16_t nFrameIndex;
float fProgress;
int16_t nTimes;
bool bDirection;
uint32_t nMills;
uint16_t nInterval;
} easing_t;
float _easing_calc_Linear(const float t);
float _easing_calc_InQuad(const float t);
float _easing_calc_OutQuad(const float t);
float _easing_calc_InOutQuad(const float t);
float _easing_calc_InCubic(const float t);
float _easing_calc_OutCubic(const float t);
float _easing_calc_InOutCubic(const float t);
float _easing_calc_InQuart(const float t);
float _easing_calc_OutQuart(const float t);
float _easing_calc_InOutQuart(const float t);
float _easing_calc_InQuint(const float t);
float _easing_calc_OutQuint(const float t);
float _easing_calc_InOutQuint(const float t);
float _easing_calc_InSine(const float t);
float _easing_calc_OutSine(const float t);
float _easing_calc_InOutSine(const float t);
float _easing_calc_InExpo(const float t);
float _easing_calc_OutExpo(const float t);
float _easing_calc_InOutExpo(const float t);
float _easing_calc_InCirc(const float t);
float _easing_calc_OutCirc(const float t);
float _easing_calc_InOutCirc(const float t);
float _easing_calc_InBack(const float t);
float _easing_calc_OutBack(const float t);
float _easing_calc_InOutBack(const float t);
float _easing_calc_InElastic(const float t);
float _easing_calc_OutElastic(const float t);
float _easing_calc_InOutElastic(const float t);
float _easing_calc_InBounce(const float t);
float _easing_calc_OutBounce(const float t);
float _easing_calc_InOutBounce(const float t);
void easing_set_tick_callback(easing_tick_cb_t tick_cb);
void easing_init(
easing_t* pEasing,
easing_mode_t dwMode,
easing_calc_t lpfnCalc,
easing_pos_t nOffset,
uint16_t nFrameCount,
uint16_t nInterval
);
void easing_start_absolute(
easing_t* pEasing,
easing_pos_t nStart,
easing_pos_t nStop);
void easing_start_relative(
easing_t* pEasing,
easing_pos_t nDistance);
void easing_update(easing_t* easing);
bool easing_isok(easing_t* pEasing);
void easing_stop(easing_t* pEasing, easing_pos_t nCurrent);
easing_pos_t easing_curpos(easing_t* pEasing);
#ifdef __cplusplus
}
#endif
#endif