/**
* @file LED_BREATH_ATY.c
*
* @param Project DEVICE_GENERAL_ATY_LIB
*
* @author ATY
*
* @copyright
* - Copyright 2017 - 2026 MZ-ATY
* - This code follows:
* - MZ-ATY Various Contents Joint Statement -
*
* https://mengze.top/MZ-ATY_VCJS
* - CC 4.0 BY-NC-SA -
*
* https://creativecommons.org/licenses/by-nc-sa/4.0/
* - Your use will be deemed to have accepted the terms of this statement.
*
* @brief functions of LED for C platform
*
* @version
* - 1_01_250814 > ATY
* -# Preliminary version, first Release
********************************************************************************
*/
#ifndef __LED_BREATH_ATY_C
#define __LED_BREATH_ATY_C
#include "LED_BREATH_ATY.h"
/******************************* For user *************************************/
/******************************************************************************/
void SetLedBreathMode(struct LED_BREATH_ATY_Dev* dev, LedBreathMode_t mode)
{
dev->breathMode = mode;
dev->breathTimer = 0;
dev->breathDir = 1;
dev->breathVal = 0;
dev->breathPauseCnt = 0;
}
void LedBreath(struct LED_BREATH_ATY_Dev* dev)
{
dev->breathUpdate = 0;
dev->breathTimer++;
switch(dev->breathMode)
{
case BREATH_MODE_SMOOTH:
if(dev->breathTimer >= BREATH_LED_SPEED_MID * 2) { dev->breathUpdate = 1; }
break;
case BREATH_MODE_STEP:
if(dev->breathTimer >= BREATH_LED_SPEED_MID * 2) { dev->breathStep = 10; dev->breathUpdate = 1; }
break;
case BREATH_MODE_FAST:
if(dev->breathTimer >= BREATH_LED_SPEED_MID / 4) { dev->breathUpdate = 1; }
break;
case BREATH_MODE_SLOW:
if(dev->breathTimer >= BREATH_LED_SPEED_MID * 4) { dev->breathUpdate = 1; }
break;
case BREATH_MODE_PAUSE_TOP:
if(dev->breathTimer >= BREATH_LED_SPEED_MID * 2) { dev->breathUpdate = 1; }
if(dev->breathVal == dev->breathMax && dev->breathPauseCnt < 10) {
dev->breathPauseCnt++;
dev->breathUpdate = 0;
}
else if(dev->breathVal == dev->breathMax) {
dev->breathPauseCnt = 0;
}
break;
case BREATH_MODE_PAUSE_BOTTOM:
if(dev->breathTimer >= BREATH_LED_SPEED_MID * 2) { dev->breathUpdate = 1; }
if(dev->breathVal == dev->breathMin && dev->breathPauseCnt < 10) {
dev->breathPauseCnt++;
dev->breathUpdate = 0;
}
else if(dev->breathVal == dev->breathMin) {
dev->breathPauseCnt = 0;
}
break;
case BREATH_MODE_PULSE:
if(dev->breathDir == -1){
dev->breathVal = 1;
dev->breathUpdate = 1;
}
else{
if(dev->breathTimer >= BREATH_LED_SPEED_MID * 2) { dev->breathUpdate = 1; }
}
default:
if(dev->breathTimer >= BREATH_LED_SPEED_MID * 2) { dev->breathUpdate = 1; }
break;
}
if(dev->breathUpdate) {
dev->breathTimer = 0;
dev->breathVal += (dev->breathDir * dev->breathStep);
if(dev->breathVal >= dev->breathMax) {
dev->breathVal = dev->breathMax;
dev->breathDir = -1;
}
else if(dev->breathVal <= dev->breathMin) {
dev->breathVal = dev->breathMin;
dev->breathDir = 1;
}
dev->pwmSet(dev->breathVal);
}
}
#endif /* __LED_BREATH_ATY_C */
/************************************ etc *************************************/
/* init */
// void LED_1_Breath_PWM_SET(uint8_t breathVal){
// // __HAL_TIM_SET_COUNTER(&htim2, 0);
// __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, breathVal * 65535 / 100);
// }
// struct LED_BREATH_ATY_Dev LED_BREATH_ATY_t_2 = {
// .breathMode = BREATH_MODE_FAST,
// .breathTimer = 0,
// .breathDir = 1,
// .breathVal = 0,
// .breathPauseCnt = 0,
// .breathStep = 1,
// .breathMax = BREATH_LED_MAX,
// .breathMin = BREATH_LED_MIN,
// .breathUpdate = 0,
// .pwmSet = LED_2_Breath_PWM_SET,
// .lock = __ATY_UNLOCKED,
// .debugEnable = 0,
// };
/* use */
// LedBreath(&LED_BREATH_ATY_t_1); // put at 1ms cycle
/******************************************************************************/
/******************************** End Of File *********************************/