/**
* @file LED_ATY.c
*
* @param Project DEVICE_GENERAL_ATY_LIB
*
* @author ATY
*
* @copyright
* - Copyright 2017 - 2023 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 all embedded device
*
* @version
* - 1_01_220901 > ATY
* -# Preliminary version, first Release
* - 1_02_231229 > ATY
* -# change struct to dev type
* - 1_01_240111 > ATY
* -# add lock
********************************************************************************
*/
#ifndef __LED_ATY_C
#define __LED_ATY_C
#include "LED_ATY.h"
/******************************* For user *************************************/
/******************************************************************************/
/**
* @brief set sysled blink ledBlinkType
*
* @param dev device
* @return uint8_t
* @note put this function at timer IT callback, change
* @note 0x01: light on and off cycle
0x10: light on and off cycle long time ver
0x02: light on blink twice
0x20: light off blink twice
0x03: light on blink thrice
0x30: light off blink thrice
0x40: breath // not recommended to use
* @note if(ledBlinkType - 40 >= 10) at large time cycle
if(ledBlinkType - 40 < 10) at small time cycle(breath type is 40-49)
*/
uint8_t SysLedBlink(struct LED_ATY_Dev* dev)
{
static uint8_t ledBlinkLastType = 0;
__ATY_LOCK(dev);
if(ledBlinkLastType != dev->ledBlinkType){
ledBlinkLastType = dev->ledBlinkType;
dev->ledBlinkStep = 0;
}
if(dev->ledBlinkType == 0x01)
{
if(dev->ledBlinkStep == 0){
dev->ledBlinkStep = 1;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep != 0){
dev->ledBlinkStep = 0;
dev->ioSet(_ATY_HL_H);
if(dev->debugEnable == 1)
dev->LOG("\r\nSysLed Blink.");
}
}
else if(dev->ledBlinkType == 0x10)
{
dev->ledBlinkStep++;
if(dev->ledBlinkStep < 10)
dev->ioSet(_ATY_HL_L);
else if(dev->ledBlinkStep >= 10 && dev->ledBlinkStep < 20)
dev->ioSet(_ATY_HL_H);
else{
dev->ledBlinkStep = 0;
}
}
// Type 2 & 3 put at short timer is better, like 100ms
else if(dev->ledBlinkType == 0x02)
{
if(dev->ledBlinkStep == 0){
dev->ledBlinkStep = 1;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep == 1){
dev->ledBlinkStep = 2;
dev->ioSet(_ATY_HL_H);
}
else if(dev->ledBlinkStep == 2){
dev->ledBlinkStep = 3;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep == 3){
dev->ledBlinkStep = 4;
dev->ioSet(_ATY_HL_H);
}
else if((dev->ledBlinkStep >= 4) && (dev->ledBlinkStep < dev->longSteps)){
dev->ledBlinkStep++;
}
else if(dev->ledBlinkStep == dev->longSteps){
dev->ledBlinkStep = 0;
if(dev->debugEnable == 1)
dev->LOG("\r\nSysLed Blink.");
}
}
else if(dev->ledBlinkType == 0x20)
{
if(dev->ledBlinkStep == 0){
dev->ledBlinkStep = 1;
dev->ioSet(_ATY_HL_H);
}
else if(dev->ledBlinkStep == 1){
dev->ledBlinkStep = 2;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep == 2){
dev->ledBlinkStep = 3;
dev->ioSet(_ATY_HL_H);
}
else if(dev->ledBlinkStep == 3){
dev->ledBlinkStep = 4;
dev->ioSet(_ATY_HL_L);
}
else if((dev->ledBlinkStep >= 4) && (dev->ledBlinkStep < dev->longSteps)){
dev->ledBlinkStep++;
}
else if(dev->ledBlinkStep == dev->longSteps){
dev->ledBlinkStep = 0;
if(dev->debugEnable == 1)
dev->LOG("\r\nSysLed Blink.");
}
}
else if(dev->ledBlinkType == 0x03)
{
if(dev->ledBlinkStep == 0){
dev->ledBlinkStep = 1;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep == 1){
dev->ledBlinkStep = 2;
dev->ioSet(_ATY_HL_H);
}
else if(dev->ledBlinkStep == 2){
dev->ledBlinkStep = 3;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep == 3){
dev->ledBlinkStep = 4;
dev->ioSet(_ATY_HL_H);
}
else if(dev->ledBlinkStep == 4){
dev->ledBlinkStep = 5;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep == 5){
dev->ledBlinkStep = 6;
dev->ioSet(_ATY_HL_H);
}
else if((dev->ledBlinkStep >= 6) && (dev->ledBlinkStep < dev->longSteps)){
dev->ledBlinkStep++;
}
else if(dev->ledBlinkStep == dev->longSteps){
dev->ledBlinkStep = 0;
if(dev->debugEnable == 1)
dev->LOG("\r\nSysLed Blink.");
}
}
else if(dev->ledBlinkType == 0x30)
{
if(dev->ledBlinkStep == 0){
dev->ledBlinkStep = 1;
dev->ioSet(_ATY_HL_H);
}
else if(dev->ledBlinkStep == 1){
dev->ledBlinkStep = 2;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep == 2){
dev->ledBlinkStep = 3;
dev->ioSet(_ATY_HL_H);
}
else if(dev->ledBlinkStep == 3){
dev->ledBlinkStep = 4;
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep == 4){
dev->ledBlinkStep = 5;
dev->ioSet(_ATY_HL_H);
}
else if(dev->ledBlinkStep == 5){
dev->ledBlinkStep = 6;
dev->ioSet(_ATY_HL_L);
}
else if((dev->ledBlinkStep >= 6) && (dev->ledBlinkStep < dev->longSteps)){
dev->ledBlinkStep++;
}
else if(dev->ledBlinkStep == dev->longSteps){
dev->ledBlinkStep = 0;
if(dev->debugEnable == 1)
dev->LOG("\r\nSysLed Blink.");
}
}
else if(dev->ledBlinkType == 0x40) // put at 1ms cycle, cycle more faster, led animation more breathly
{
static uint16_t cycleCount = 0;
if(cycleCount < dev->onePulseCount)
cycleCount++;
else
cycleCount = 0;
dev->ledBlinkStep++;
// UartSendFloatStr(cycleCount);
if(dev->ledBlinkStep < dev->flowCycleCount){
if(cycleCount < (dev->onePulseCount * dev->ledBlinkStep / dev->flowCycleCount))
dev->ioSet(_ATY_HL_H);
else
dev->ioSet(_ATY_HL_L);
}
else if(dev->ledBlinkStep >= dev->flowCycleCount && dev->ledBlinkStep < dev->flowCycleCount * 2){
if(cycleCount < (dev->onePulseCount * (dev->ledBlinkStep - dev->flowCycleCount) / dev->flowCycleCount))
dev->ioSet(_ATY_HL_L);
else
dev->ioSet(_ATY_HL_H);
}
if(dev->ledBlinkStep >= dev->flowCycleCount * 2)
dev->ledBlinkStep = 0;
}
__ATY_UNLOCK(dev);
return 0;
}
#endif /* __LED_ATY_C */
/************************************ etc *************************************/
/* init */
// void SysLed_1_IO_SET_L(void){ GPIO_SET_L(SYSLED_GPIO_Port, SYSLED_Pin); }
// void SysLed_1_IO_SET_H(void){ GPIO_SET_H(SYSLED_GPIO_Port, SYSLED_Pin); }
// struct LED_ATY_Dev LED_ATY_t_1 = {
// .ledBlinkStep = 0,
// .ledBlinkType = 0x01,
// .ioSetL = SysLed_1_IO_SET_L,
// .ioSetH = SysLed_1_IO_SET_H,
// .longSteps = 20,
// .lock = _ATY_UNLOCKED,
// .debugEnable = 0,
// .LOG = printf};
// struct LED_ATY_Dev LED_ATY_t_1 = {
// .ledBlinkStep = 0,
// .ledBlinkType = 0x40,
// .ioSetL = SysLed_1_IO_SET_L,
// .ioSetH = SysLed_1_IO_SET_H,
// .longSteps = 20,
// .flowCycleCount = 60000,
// .onePulseCount = 60,
// .lock = _ATY_UNLOCKED,
// .debugEnable = 0,
// .LOG = printf};
/* use */
// SysLedBlink(&LED_ATY_t_1); // put at 1ms cycle
/******************************************************************************/
/******************************** End Of File *********************************/